ash: [EVAL] Make eval with empty arguments return 0
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 28 Sep 2016 22:30:31 +0000 (00:30 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 28 Sep 2016 22:30:31 +0000 (00:30 +0200)
This is a backport of upstream commit:

    [EVAL] Make eval with empty arguments return 0

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c
shell/ash_test/ash-misc/eval1.right [new file with mode: 0644]
shell/ash_test/ash-misc/eval1.tests [new file with mode: 0755]
shell/hush_test/hush-misc/eval1.right [new file with mode: 0644]
shell/hush_test/hush-misc/eval1.tests [new file with mode: 0755]

index 7a7ea18964d8f7189531d880f44c0edd291a75d3..d0c0a510cebf441612acdda4b55898a1bc25aefc 100644 (file)
@@ -8383,7 +8383,6 @@ dotrap(void)
 
        TRACE(("dotrap entered\n"));
        for (sig = 1, g = gotsig; sig < NSIG; sig++, g++) {
-               int want_exexit;
                char *t;
 
                if (*g == 0)
@@ -8398,11 +8397,11 @@ dotrap(void)
                *g = 0;
                if (!t)
                        continue;
-               want_exexit = evalstring(t, SKIPEVAL);
+               evalstring(t, SKIPEVAL);
                exitstatus = savestatus;
-               if (want_exexit) {
-                       TRACE(("dotrap returns %d\n", want_exexit));
-                       return want_exexit;
+               if (evalskip) {
+                       TRACE(("dotrap returns %d\n", evalskip));
+                       return evalskip;
                }
        }
 
@@ -9287,23 +9286,19 @@ static const struct builtincmd builtintab[] = {
 
 /* Should match the above table! */
 #define COMMANDCMD (builtintab + \
-       2 + \
-       1 * ENABLE_ASH_BUILTIN_TEST + \
-       1 * ENABLE_ASH_BUILTIN_TEST * ENABLE_ASH_BASH_COMPAT + \
-       1 * ENABLE_ASH_ALIAS + \
-       1 * ENABLE_ASH_JOB_CONTROL + \
-       3)
-#define EXECCMD (builtintab + \
-       2 + \
-       1 * ENABLE_ASH_BUILTIN_TEST + \
-       1 * ENABLE_ASH_BUILTIN_TEST * ENABLE_ASH_BASH_COMPAT + \
-       1 * ENABLE_ASH_ALIAS + \
-       1 * ENABLE_ASH_JOB_CONTROL + \
-       3 + \
-       1 * ENABLE_ASH_CMDCMD + \
-       1 + \
-       ENABLE_ASH_BUILTIN_ECHO + \
-       1)
+       /* . : */       2 + \
+       /* [ */         1 * ENABLE_ASH_BUILTIN_TEST + \
+       /* [[ */        1 * ENABLE_ASH_BUILTIN_TEST * ENABLE_ASH_BASH_COMPAT + \
+       /* alias */     1 * ENABLE_ASH_ALIAS + \
+       /* bg */        1 * ENABLE_ASH_JOB_CONTROL + \
+       /* break cd cddir  */   3)
+#define EVALCMD (COMMANDCMD + \
+       /* command */   1 * ENABLE_ASH_CMDCMD + \
+       /* continue */  1 + \
+       /* echo */      1 * ENABLE_ASH_BUILTIN_ECHO + \
+       0)
+#define EXECCMD (EVALCMD + \
+       /* eval */      1)
 
 /*
  * Search the table of builtin commands.
@@ -12218,34 +12213,29 @@ evalstring(char *s, int mask)
 {
        union node *n;
        struct stackmark smark;
-       int skip;
-//     int status;
+       int status;
 
        s = sstrdup(s);
        setinputstring(s);
        setstackmark(&smark);
 
-       skip = 0;
-//     status = 0;
+       status = 0;
        while ((n = parsecmd(0)) != NODE_EOF) {
                int i;
 
                i = evaltree(n, 0);
-//             if (n)
-//                     status = i;
+               if (n)
+                       status = i;
                popstackmark(&smark);
-               skip = evalskip;
-               if (skip)
+               if (evalskip)
                        break;
        }
        popstackmark(&smark);
        popfile();
        stunalloc(s);
 
-       skip &= mask;
-       evalskip = skip;
-       return skip;
-//     return status;
+       evalskip &= mask;
+       return status;
 }
 
 /*
@@ -12272,9 +12262,9 @@ evalcmd(int argc UNUSED_PARAM, char **argv)
                        STPUTC('\0', concat);
                        p = grabstackstr(concat);
                }
-               evalstring(p, ~SKIPEVAL);
+               return evalstring(p, ~SKIPEVAL);
        }
-       return exitstatus;
+       return 0;
 }
 
 /*
diff --git a/shell/ash_test/ash-misc/eval1.right b/shell/ash_test/ash-misc/eval1.right
new file mode 100644 (file)
index 0000000..7b24a35
--- /dev/null
@@ -0,0 +1 @@
+Ok:0
diff --git a/shell/ash_test/ash-misc/eval1.tests b/shell/ash_test/ash-misc/eval1.tests
new file mode 100755 (executable)
index 0000000..b78c6cc
--- /dev/null
@@ -0,0 +1,4 @@
+# empty eval nevertheless sets $? = 0
+false
+eval
+echo Ok:$?
diff --git a/shell/hush_test/hush-misc/eval1.right b/shell/hush_test/hush-misc/eval1.right
new file mode 100644 (file)
index 0000000..7b24a35
--- /dev/null
@@ -0,0 +1 @@
+Ok:0
diff --git a/shell/hush_test/hush-misc/eval1.tests b/shell/hush_test/hush-misc/eval1.tests
new file mode 100755 (executable)
index 0000000..b78c6cc
--- /dev/null
@@ -0,0 +1,4 @@
+# empty eval nevertheless sets $? = 0
+false
+eval
+echo Ok:$?