@@ -52,25 +52,25 @@ int write_map(pid_t pid, char *file, char *map)
int child_fn(void *arg)
{
- int sk, orig_sk = (int)(long)arg;
+ int ret = 1, sk = -1, orig_sk = (int)(long)arg;
struct sockaddr_un addr;
socklen_t len = sizeof(addr);
if (getsockname(orig_sk, &addr, &len) < 0) {
pr_perror("getsockname()");
- goto err;
+ goto out;
}
futex_wait_while_lt(futex, MAPS_SET);
if (futex_get(futex) == EMERGENCY_ABORT)
- return 1;
+ goto out;
if (setuid(0)) {
pr_perror("Can't set uid");
- goto err;
+ goto out;
}
if (setgid(0)) {
pr_perror("Can't set gid");
- goto err;
+ goto out;
}
futex_set_and_wake(futex, CHILD_PREPARED);
@@ -79,19 +79,22 @@ int child_fn(void *arg)
sk = socket(PF_UNIX, SOCK_DGRAM, 0);
if (sk < 0) {
pr_perror("socket");
- goto err;
+ goto out;
}
/* This must complete w/o errors, as orig_sk is from another net namespace */
if (bind(sk, (struct sockaddr *)&addr, len) < 0) {
pr_perror("bind");
- goto err;
+ goto out;
}
- return 0;
-err:
- futex_set_and_wake(futex, EMERGENCY_ABORT);
- return 1;
+ ret = 0;
+out:
+ if (sk >= 0)
+ close(sk);
+ if (ret)
+ futex_set_and_wake(futex, EMERGENCY_ABORT);
+ return ret;
}
int main(int argc, char **argv)
@@ -127,7 +130,8 @@ int main(int argc, char **argv)
{
char stack;
- pid = clone(child_fn, &stack - 256, CLONE_NEWUSER|CLONE_NEWNET|CLONE_NEWPID, (void *)(long)sk);
+ pid = clone(child_fn, (void *)(((unsigned long)&stack) - 256),
+ CLONE_NEWUSER|CLONE_NEWNET|CLONE_NEWPID, (void *)(long)sk);
if (pid == -1) {
fail("clone");
return 1;