X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=execute.c;h=73d82d5a76218ac50d839ec80466b8d6fe5e80e1;hp=bf9a087c050d354ace8477fb6dfb8989e8ec0ccb;hb=d8b4e2e9acb8c68cd46405ae1e9b8fb06cb75269;hpb=02a51abad1d6f334599c8d648b18d000b6118eb5 diff --git a/execute.c b/execute.c index bf9a087c0..73d82d5a7 100644 --- a/execute.c +++ b/execute.c @@ -73,7 +73,7 @@ static int shift_fds(int fds[], unsigned n_fds) { if ((nfd = fcntl(fds[i], F_DUPFD, i+3)) < 0) return -errno; - assert_se(close_nointr(fds[i]) == 0); + close_nointr_nofail(fds[i]); fds[i] = nfd; /* Hmm, the fd we wanted isn't free? Then @@ -91,7 +91,7 @@ static int shift_fds(int fds[], unsigned n_fds) { return 0; } -static int flags_fds(int fds[], unsigned n_fds, bool nonblock) { +static int flags_fds(const int fds[], unsigned n_fds, bool nonblock) { unsigned i; int r; @@ -137,7 +137,7 @@ static int open_null_as(int flags, int nfd) { if (fd != nfd) { r = dup2(fd, nfd) < 0 ? -errno : nfd; - close_nointr(fd); + close_nointr_nofail(fd); } else r = nfd; @@ -191,7 +191,7 @@ static int connect_logger_as(const ExecContext *context, ExecOutput output, cons if (fd != nfd) { r = dup2(fd, nfd) < 0 ? -errno : nfd; - close_nointr(fd); + close_nointr_nofail(fd); } else r = nfd; @@ -334,7 +334,6 @@ static int chown_terminal(int fd, uid_t uid) { struct stat st; assert(fd >= 0); - assert(uid >= 0); /* This might fail. What matters are the results. */ fchown(fd, uid, -1); @@ -343,8 +342,7 @@ static int chown_terminal(int fd, uid_t uid) { if (fstat(fd, &st) < 0) return -errno; - if (st.st_uid != uid || - st.st_mode != TTY_MODE) + if (st.st_uid != uid || (st.st_mode & 0777) != TTY_MODE) return -EPERM; return 0; @@ -668,7 +666,7 @@ static int enforce_user(const ExecContext *context, uid_t uid) { int exec_spawn(ExecCommand *command, const ExecContext *context, - int *fds, unsigned n_fds, + int fds[], unsigned n_fds, bool apply_permissions, bool apply_chroot, bool confirm_spawn, @@ -835,6 +833,12 @@ int exec_spawn(ExecCommand *command, r = EXIT_USER; goto fail; } + + if (is_terminal_input(context->std_input)) + if (chown_terminal(STDIN_FILENO, uid) < 0) { + r = EXIT_STDIN; + goto fail; + } } if (apply_permissions) @@ -843,12 +847,6 @@ int exec_spawn(ExecCommand *command, goto fail; } - if (is_terminal_input(context->std_input)) - if (chown_terminal(STDIN_FILENO, uid) < 0) { - r = EXIT_STDIN; - goto fail; - } - if (apply_chroot) { if (context->root_directory) if (chroot(context->root_directory) < 0) {