msh: fix obscure case with backticks and closed fd 1
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 9 May 2007 22:16:08 +0000 (22:16 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 9 May 2007 22:16:08 +0000 (22:16 -0000)
shell/msh.c

index 4feede6..ac49af1 100644 (file)
@@ -2546,7 +2546,7 @@ static int execute(struct op *t, int *pin, int *pout, int act)
                                interactive = 0;
                                if (pin == NULL) {
                                        close(0);
-                                       open(bb_dev_null, O_RDONLY);
+                                       xopen(bb_dev_null, O_RDONLY);
                                }
                                _exit(execute(t->left, pin, pout, FEXEC));
                        }
@@ -2823,12 +2823,12 @@ static int forkexec(struct op *t, int *pin, int *pout, int act, char **wp)
 #endif
 
        if (pin != NULL) {
-               dup2(pin[0], 0);
-               closepipe(pin);
+               xmove_fd(pin[0], 0);
+               if (pin[1] != 0) close(pin[1]);
        }
        if (pout != NULL) {
-               dup2(pout[1], 1);
-               closepipe(pout);
+               xmove_fd(pout[1], 1);
+               if (pout[1] != 1) close(pout[0]);
        }
 
        iopp = t->ioact;
@@ -4166,8 +4166,13 @@ static int grave(int quoted)
                if (ourtrap[j] && signal(j, SIG_IGN) != SIG_IGN)
                        signal(j, SIG_DFL);
 
-       dup2(pf[1], 1);
-       closepipe(pf);
+       /* Testcase where below checks are needed:
+        * close stdout & run this script:
+        *  files=`ls`
+        *  echo "$files" >zz
+        */
+       xmove_fd(pf[1], 1);
+       if (pf[0] != 1) close(pf[0]);
 
        argument_list[0] = (char *) DEFAULT_SHELL;
        argument_list[1] = (char *) "-c";