ash: [BUILTIN] Merge SKIPFUNC/SKIPFILE and only clear SKIPFUNC when leaving dotcmd
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 30 Sep 2016 12:18:34 +0000 (14:18 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 30 Sep 2016 12:46:41 +0000 (14:46 +0200)
Upstream commit:

    Date: Sat, 9 Jul 2011 22:05:22 +0800
    [BUILTIN] Merge SKIPFUNC/SKIPFILE and only clear SKIPFUNC when leaving dotcmd

    Currently upon leaving a dotcmd the evalskip state is reset so
    if a continue/break statement is used within a dot script it would
    have no effect outside of the dot script.

    This is inconsistent with other shells.

    This patch is based on one by Jilles Tjoelker and only clears
    SKIPFUNC when leaving a dot script.  As a result continue/break
    will remain in effect.

    It also merges SKIPFUNC/SKIPFILE as they have no practical difference.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index a1b211ae097de0b6b9c664017a02aebddf32042d..9fd1b55e2272d53637dd35e317fe489d74d5df82 100644 (file)
@@ -8348,7 +8348,6 @@ defun(char *name, union node *func)
 #define SKIPBREAK      (1 << 0)
 #define SKIPCONT       (1 << 1)
 #define SKIPFUNC       (1 << 2)
-#define SKIPFILE       (1 << 3)
 #define SKIPEVAL       (1 << 4)
 static smallint evalskip;       /* set to SKIPxxx if we are skipping commands */
 static int skipcount;           /* number of levels to skip */
@@ -9148,7 +9147,7 @@ returncmd(int argc UNUSED_PARAM, char **argv)
         * If called outside a function, do what ksh does;
         * skip the rest of the file.
         */
-       evalskip = funcnest ? SKIPFUNC : SKIPFILE;
+       evalskip = SKIPFUNC;
        return argv[1] ? number(argv[1]) : exitstatus;
 }
 
@@ -12330,7 +12329,7 @@ cmdloop(int top)
                skip = evalskip;
 
                if (skip) {
-                       evalskip = 0;
+                       evalskip &= ~SKIPFUNC;
                        return skip & SKIPEVAL;
                }
        }