]> granicus.if.org Git - sudo/commitdiff
Check for dup2() failure.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 15 Jun 2010 13:02:23 +0000 (09:02 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 15 Jun 2010 13:02:23 +0000 (09:02 -0400)
plugins/sudoers/logging.c
src/exec_pty.c
src/selinux.c
src/sudo.c
src/tgetpass.c

index 92a20c9e954956239d35edd1cc4da816eb3139cf..31e8287a73e6ae2508e116d21c53c41a22e7ee16 100644 (file)
@@ -463,7 +463,7 @@ send_mail(const char *fmt, ...)
     }
 # endif
 #endif
-    chdir("/");
+    (void) chdir("/");
     if ((fd = open(_PATH_DEVNULL, O_RDWR, 0644)) != -1) {
        (void) dup2(fd, STDIN_FILENO);
        (void) dup2(fd, STDOUT_FILENO);
@@ -501,12 +501,15 @@ send_mail(const char *fmt, ...)
 
                /* Child, set stdin to output side of the pipe */
                if (pfd[0] != STDIN_FILENO) {
-                   (void) dup2(pfd[0], STDIN_FILENO);
+                   if (dup2(pfd[0], STDIN_FILENO) != -1) {
+                       mysyslog(LOG_ERR, "cannot dup stdin: %m");
+                       _exit(127);
+                   }
                    (void) close(pfd[0]);
                }
                (void) close(pfd[1]);
 
-               /* Build up an argv based the mailer path and flags */
+               /* Build up an argv based on the mailer path and flags */
                mflags = estrdup(def_mailerflags);
                mpath = estrdup(def_mailerpath);
                if ((argv[0] = strrchr(mpath, ' ')))
index 232da0654f2f2ef1b216293ae82a5f5d9f66b12b..d42109cc2ebeb755dda7e710d436d0d85938ab24 100644 (file)
@@ -1096,9 +1096,10 @@ exec_pty(struct command_details *details, char *argv[], char *envp[])
     setpgid(0, self);
 
     /* Wire up standard fds, note that stdout/stderr may be pipes. */
-    dup2(io_fds[SFD_STDIN], STDIN_FILENO);
-    dup2(io_fds[SFD_STDOUT], STDOUT_FILENO);
-    dup2(io_fds[SFD_STDERR], STDERR_FILENO);
+    if (dup2(io_fds[SFD_STDIN], STDIN_FILENO) == -1 ||
+       dup2(io_fds[SFD_STDOUT], STDOUT_FILENO) == -1 ||
+       dup2(io_fds[SFD_STDERR], STDERR_FILENO) == -1)
+       error(1, "dup2");
 
     /* Wait for parent to grant us the tty if we are foreground. */
     if (foreground) {
index 3a40d5a3baf259d9c098aad69d1f8c17c04aeaf8..c74e9cd027f15045b5226cec3ced8bb100ee7385 100644 (file)
@@ -114,6 +114,7 @@ relabel_tty(const char *ttyn, int ptyfd)
 {
     security_context_t tty_con = NULL;
     security_context_t new_tty_con = NULL;
+    int fd;
 
     se_state.ttyfd = ptyfd;
 
@@ -162,22 +163,26 @@ relabel_tty(const char *ttyn, int ptyfd)
            if (se_state.enforcing)
                goto bad;
        }
-       dup2(se_state.ttyfd, ptyfd);
+       if (dup2(se_state.ttyfd, ptyfd) == -1) {
+           warning("dup2");
+           goto bad;
+       }
     } else {
        /* Re-open tty to get new label and reset std{in,out,err} */
        close(se_state.ttyfd);
        se_state.ttyfd = open(ttyn, O_RDWR|O_NONBLOCK);
-       if (se_state.ttyfd == -1)
+       if (se_state.ttyfd == -1) {
            warning("unable to open %s", ttyn);
-       else
-           (void)fcntl(se_state.ttyfd, F_SETFL,
-               fcntl(se_state.ttyfd, F_GETFL, 0) & ~O_NONBLOCK);
-       if (isatty(STDIN_FILENO))
-           dup2(se_state.ttyfd, STDIN_FILENO);
-       if (isatty(STDOUT_FILENO))
-           dup2(se_state.ttyfd, STDOUT_FILENO);
-       if (isatty(STDERR_FILENO))
-           dup2(se_state.ttyfd, STDERR_FILENO);
+           goto bad;
+       }
+       (void)fcntl(se_state.ttyfd, F_SETFL,
+           fcntl(se_state.ttyfd, F_GETFL, 0) & ~O_NONBLOCK);
+       for (fd = STDIN_FILENO; fd <= STDERR_FILENO; fd++) {
+           if (isatty(fd) && dup2(se_state.ttyfd, fd) == -1) {
+               warning("dup2");
+               goto bad;
+           }
+       }
     }
     /* Retain se_state.ttyfd so we can restore label when command finishes. */
     (void)fcntl(se_state.ttyfd, F_SETFD, FD_CLOEXEC);
index 39c148adf5170de13ba2f9d29d867be4e4e8f211..ca6f0c08d437bd42a3c15ec6ffb1a3e9505b6610 100644 (file)
@@ -271,16 +271,16 @@ fix_fds(void)
     miss[STDOUT_FILENO] = fcntl(STDOUT_FILENO, F_GETFL, 0) == -1;
     miss[STDERR_FILENO] = fcntl(STDERR_FILENO, F_GETFL, 0) == -1;
     if (miss[STDIN_FILENO] || miss[STDOUT_FILENO] || miss[STDERR_FILENO]) {
-       if ((devnull = open(_PATH_DEVNULL, O_RDWR, 0644)) != -1) {
-           if (miss[STDIN_FILENO])
-               (void) dup2(devnull, STDIN_FILENO);
-           if (miss[STDOUT_FILENO])
-               (void) dup2(devnull, STDOUT_FILENO);
-           if (miss[STDERR_FILENO])
-               (void) dup2(devnull, STDERR_FILENO);
-           if (devnull > STDERR_FILENO)
-               close(devnull);
-       }
+       if ((devnull = open(_PATH_DEVNULL, O_RDWR, 0644)) == -1)
+           error(1, "unable to open %s", _PATH_DEVNULL);
+       if (miss[STDIN_FILENO] && dup2(devnull, STDIN_FILENO) == -1)
+           error(1, "dup2");
+       if (miss[STDOUT_FILENO] && dup2(devnull, STDOUT_FILENO) == -1)
+           error(1, "dup2");
+       if (miss[STDERR_FILENO] && dup2(devnull, STDERR_FILENO) == -1)
+           error(1, "dup2");
+       if (devnull > STDERR_FILENO)
+           close(devnull);
     }
 }
 
index dfd2a742d0359f5c2fce847e8e786ab619ff4813..d4abad01b770cb93c64cd49f976ad2f676f845ea 100644 (file)
@@ -222,7 +222,10 @@ sudo_askpass(const char *askpass, const char *prompt)
 
     if (pid == 0) {
        /* child, point stdout to output side of the pipe and exec askpass */
-       (void) dup2(pfd[1], STDOUT_FILENO);
+       if (dup2(pfd[1], STDOUT_FILENO) == -1) {
+           warning("dup2");
+           _exit(255);
+       }
        (void) setuid(ROOT_UID);
        if (setgid(user_details.gid)) {
            warning("unable to set gid to %u", (unsigned int)user_details.gid);