OSDN Git Service

wordexp.c: fix a bug where we might close stdout
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Sep 2009 19:48:16 +0000 (21:48 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Sep 2009 19:48:16 +0000 (21:48 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libc/misc/wordexp/wordexp.c

index 8167ed6..4a2b50b 100644 (file)
@@ -787,6 +787,7 @@ parse_arith(char **word, size_t * word_length, size_t * max_length,
 static void attribute_noreturn
 exec_comm_child(char *comm, int *fildes, int showerr, int noexec)
 {
+       int fd;
        const char *args[4] = { _PATH_BSHELL, "-c", comm, NULL };
 
        /* Execute the command, or just check syntax? */
@@ -794,13 +795,14 @@ exec_comm_child(char *comm, int *fildes, int showerr, int noexec)
                args[1] = "-nc";
 
        /* Redirect output.  */
-       dup2(fildes[1], 1);
-       close(fildes[1]);
+       fd = fildes[1];
+       if (fd != 1) {
+               dup2(fd, 1);
+               close(fd);
+       }
 
        /* Redirect stderr to /dev/null if we have to.  */
        if (showerr == 0) {
-               int fd;
-
                close(2);
                fd = open(_PATH_DEVNULL, O_WRONLY);
                if (fd >= 0 && fd != 2) {
@@ -812,7 +814,8 @@ exec_comm_child(char *comm, int *fildes, int showerr, int noexec)
        /* Make sure the subshell doesn't field-split on our behalf. */
        unsetenv("IFS");
 
-       close(fildes[0]);
+       if (fildes[0] != 1)
+               close(fildes[0]);
        execve(_PATH_BSHELL, (char *const *) args, __environ);
 
        /* Bad.  What now?  */