X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fprocess%2Fposix_spawn.c;h=93fb15553537f8e3f34500f6414a5d75bdcdb85a;hb=aaa29c26eed4a09625e61c6af31d16b1a4163fc3;hp=08928b0e7e72d7e3ed7cb50b364b2797637fd800;hpb=dd5f50da6f6c3df5647e922e47f8568a8896a752;p=musl diff --git a/src/process/posix_spawn.c b/src/process/posix_spawn.c index 08928b0e..93fb1555 100644 --- a/src/process/posix_spawn.c +++ b/src/process/posix_spawn.c @@ -27,12 +27,7 @@ static int __sys_dup2(int old, int new) #ifdef SYS_dup2 return __syscall(SYS_dup2, old, new); #else - if (old==new) { - int r = __syscall(SYS_fcntl, old, F_GETFD); - return r<0 ? r : old; - } else { - return __syscall(SYS_dup3, old, new, 0); - } + return __syscall(SYS_dup3, old, new, 0); #endif } @@ -73,13 +68,17 @@ static int child(void *args_vp) __libc_sigaction(i, &sa, 0); } + if (attr->__flags & POSIX_SPAWN_SETSID) + if ((ret=__syscall(SYS_setsid)) < 0) + goto fail; + if (attr->__flags & POSIX_SPAWN_SETPGROUP) if ((ret=__syscall(SYS_setpgid, 0, attr->__pgrp))) goto fail; - /* Use syscalls directly because pthread state because the - * library functions attempt to do a multi-threaded synchronized - * id-change, which would trash the parent's state. */ + /* Use syscalls directly because the library functions attempt + * to do a multi-threaded synchronized id-change, which would + * trash the parent's state. */ if (attr->__flags & POSIX_SPAWN_RESETIDS) if ((ret=__syscall(SYS_setgid, __syscall(SYS_getgid))) || (ret=__syscall(SYS_setuid, __syscall(SYS_getuid))) ) @@ -102,12 +101,20 @@ static int child(void *args_vp) } switch(op->cmd) { case FDOP_CLOSE: - if ((ret=__syscall(SYS_close, op->fd))) - goto fail; + __syscall(SYS_close, op->fd); break; case FDOP_DUP2: - if ((ret=__sys_dup2(op->srcfd, op->fd))<0) - goto fail; + fd = op->srcfd; + if (fd != op->fd) { + if ((ret=__sys_dup2(fd, op->fd))<0) + goto fail; + } else { + ret = __syscall(SYS_fcntl, fd, F_GETFD); + ret = __syscall(SYS_fcntl, fd, F_SETFD, + ret & ~FD_CLOEXEC); + if (ret<0) + goto fail; + } break; case FDOP_OPEN: fd = __sys_open(op->path, op->oflag, op->mode); @@ -137,7 +144,7 @@ static int child(void *args_vp) fail: /* Since sizeof errno < PIPE_BUF, the write is atomic. */ ret = -ret; - if (ret) while (write(p, &ret, sizeof ret) < 0); + if (ret) while (__syscall(SYS_write, p, &ret, sizeof ret) < 0); _exit(127); } @@ -149,7 +156,7 @@ int __posix_spawnx(pid_t *restrict res, const char *restrict path, char *const argv[restrict], char *const envp[restrict]) { pid_t pid; - char stack[1024]; + char stack[1024+PATH_MAX]; int ec=0, cs; struct args args;