ash: fix "ash -c 'exec 1>&0'" complaining that fd 0 is busy
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 19 Mar 2009 01:59:59 +0000 (01:59 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 19 Mar 2009 01:59:59 +0000 (01:59 -0000)
shell/ash.c

index b33351674318e5468bcce71049fdcd00cd945e7a..179d9257b6f1f39bb60c69fa5ce512e28b479dfc 100644 (file)
@@ -11684,7 +11684,8 @@ expandstr(const char *ps)
 {
        union node n;
 
-       /* XXX Fix (char *) cast. */
+       /* XXX Fix (char *) cast. It _is_ a bug. ps is variable's value,
+        * and token processing _can_ alter it (delete NULs etc). */
        setinputstring((char *)ps);
        readtoken1(pgetc(), PSSYNTAX, nullstr, 0);
        popfile();
@@ -13802,15 +13803,20 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
        }
  state3:
        state = 4;
-       if (minusc)
+       if (minusc) {
+               /* evalstring pushes parsefile stack.
+                * Ensure we don't falsely claim that 0 (stdin)
+                * is one of stacked source fds */
+               if (!sflag)
+                       g_parsefile->fd = -1;
                evalstring(minusc, 0);
+       }
 
        if (sflag || minusc == NULL) {
 #if ENABLE_FEATURE_EDITING_SAVEHISTORY
                if (iflag) {
                        const char *hp = lookupvar("HISTFILE");
-
-                       if (hp != NULL)
+                       if (hp)
                                line_input_state->hist_file = hp;
                }
 #endif