ash: [VAR] Initialise OPTIND after importing environment
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 30 Sep 2016 12:36:59 +0000 (14:36 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 30 Sep 2016 12:46:41 +0000 (14:46 +0200)
Upstream commit 1:

    Date: Fri, 23 Aug 2013 21:27:42 +1000
    [VAR] Initialise OPTIND after importing environment

    On Sat, Mar 23, 2013 at 01:46:20AM +0000, Chris F.A. Johnson wrote:
    >   According to both the dash man page and the POSIX spec, "When the
    >   shell is invoked, OPTIND is initialized to 1."
    >
    >   However, it actually takes the value of the environment variable
    >   if it exists:
    >
    > $ OPTIND=4 dash -c 'echo "$OPTIND"'
    > 4
    > $ OPTIND=4 bash -c 'echo "$OPTIND"'
    > 1
    > $ OPTIND=4 ksh -c 'echo "$OPTIND"'
    > 1
    > $ OPTIND=4 ksh93 -c 'echo "$OPTIND"'
    > 1

    This patch fixes this by initialising OPTIND after importing the
    environment.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Upstream commit 2:

    Date: Tue, 7 Oct 2014 22:24:42 +0800
    [VAR] Use setvareq to set OPTIND initially

    There is no need to setvarint to set the initial value of OPTIND
    of one.  This patch switchs to setvareq which also lets us avoid
    an unnecessary memory allocation.

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

index 9fd1b55e2272d53637dd35e317fe489d74d5df82..a7c03bbc2fea597902bcc6170a88604abf814f5f 100644 (file)
@@ -1919,7 +1919,7 @@ static const struct {
        { VSTRFIXED|VTEXTFIXED       , "PS2=> "    , NULL            },
        { VSTRFIXED|VTEXTFIXED       , "PS4=+ "    , NULL            },
 #if ENABLE_ASH_GETOPTS
-       { VSTRFIXED|VTEXTFIXED       , "OPTIND=1"  , getoptsreset    },
+       { VSTRFIXED|VTEXTFIXED       , defoptindvar, getoptsreset    },
 #endif
 #if ENABLE_ASH_RANDOM_SUPPORT
        { VSTRFIXED|VTEXTFIXED|VUNSET|VDYNAMIC, "RANDOM", change_random },
@@ -13124,6 +13124,8 @@ init(void)
                        }
                }
 
+               setvareq((char*)defoptindvar, VTEXTFIXED);
+
                setvar0("PPID", utoa(getppid()));
 #if ENABLE_ASH_BASH_COMPAT
                p = lookupvar("SHLVL");
index 14eeaafcc6ac86cc421e37f04575c05aff68b146..98d862744432d25be36bceeac57e3de12a612a5f 100644 (file)
@@ -21,6 +21,7 @@
 #include <sys/resource.h> /* getrlimit */
 
 const char defifsvar[] ALIGN1 = "IFS= \t\n";
+const char defoptindvar[] ALIGN1 = "OPTIND=1";
 
 
 int FAST_FUNC is_well_formed_var_name(const char *s, char terminator)
index 993ed59511dc17626c5295526463f16e9c1aae8d..a82535c8672333e67fc87134db1f297e5a4db32c 100644 (file)
@@ -24,6 +24,8 @@ PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
 extern const char defifsvar[] ALIGN1; /* "IFS= \t\n" */
 #define defifs (defifsvar + 4)
 
+extern const char defoptindvar[] ALIGN1; /* "OPTIND=1" */
+
 int FAST_FUNC is_well_formed_var_name(const char *s, char terminator);
 
 /* Builtins */