}
/* Handle errors first. (Data available before the error occurred
- * might be skipped, but shouldn't matter here.) */
+ * might be dropped, but shouldn't matter here.) */
if (fds[0].revents & (POLLERR | POLLNVAL)) {
fprintf(stderr, "poll: error on master: %d\n", fds[0].revents);
break;
if (pid == -1) {
die("fork child");
} else if (pid == 0) {
+ /* Drop the privileges just now so that the other user doesn't get
+ * access to the master TTY or the session leader (which might
+ * have additional privileges). */
drop_privileges_or_die(uid, gid);
dup2_or_die(pty_slave, STDIN_FILENO);
die("tcsetattr restore");
}
- /* Wait until we got the status code from our child. poll() might also
+ /* Wait until we got the status code from our child. poll() might already
* exit after POLLHUP while we haven't collected the child yet. */
if (sigprocmask(SIG_BLOCK, &sigset, &sigset_old) != 0) {
die("sigprocmask block sigchld loop");