isolation: Refactor isolate_user() to allow for a common exit path

Currently, isolate_user() exits early if the --netns-only option is given.
That works for now, but shortly we're going to want to add some logic to
go at the end of isolate_user() that needs to run in all cases: joining a
given userns, creating a new userns, or staying in our original userns
(--netns-only).

To avoid muddying those changes, here we reorganize isolate_user() to have
a common exit path for all cases.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2022-10-14 15:25:33 +11:00 committed by Stefano Brivio
parent ea5936dd3f
commit ceb2061587

View file

@ -130,9 +130,6 @@ void isolate_initial(void)
*/ */
void isolate_user(uid_t uid, gid_t gid, bool use_userns, const char *userns) void isolate_user(uid_t uid, gid_t gid, bool use_userns, const char *userns)
{ {
char uidmap[BUFSIZ];
char gidmap[BUFSIZ];
/* First set our UID & GID in the original namespace */ /* First set our UID & GID in the original namespace */
if (setgroups(0, NULL)) { if (setgroups(0, NULL)) {
/* If we don't have CAP_SETGID, this will EPERM */ /* If we don't have CAP_SETGID, this will EPERM */
@ -153,12 +150,7 @@ void isolate_user(uid_t uid, gid_t gid, bool use_userns, const char *userns)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
/* If we're told not to use a userns, nothing more to do */ if (*userns) { /* If given a userns, join it */
if (!use_userns)
return;
/* Otherwise, if given a userns, join it */
if (*userns) {
int ufd; int ufd;
ufd = open(userns, O_RDONLY | O_CLOEXEC); ufd = open(userns, O_RDONLY | O_CLOEXEC);
@ -175,11 +167,10 @@ void isolate_user(uid_t uid, gid_t gid, bool use_userns, const char *userns)
} }
close(ufd); close(ufd);
} else if (use_userns) { /* Create and join a new userns */
char uidmap[BUFSIZ];
char gidmap[BUFSIZ];
return;
}
/* Otherwise, create our own userns */
if (unshare(CLONE_NEWUSER) != 0) { if (unshare(CLONE_NEWUSER) != 0) {
err("Couldn't create user namespace: %s", strerror(errno)); err("Couldn't create user namespace: %s", strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -194,6 +185,7 @@ void isolate_user(uid_t uid, gid_t gid, bool use_userns, const char *userns)
write_file("/proc/self/gid_map", gidmap)) { write_file("/proc/self/gid_map", gidmap)) {
warn("Couldn't configure user namespace"); warn("Couldn't configure user namespace");
} }
}
} }
/** /**