ash: [BUILTIN] Treat OPTIND=0 in the same way as OPTIND=1
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 26 Oct 2016 00:03:37 +0000 (02:03 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 26 Oct 2016 00:03:37 +0000 (02:03 +0200)
Upstream commit:

    Date: Sat, 6 Oct 2007 18:59:31 +0800
    [BUILTIN] Treat OPTIND=0 in the same way as OPTIND=1

    Previously setting OPTIND to 0 would cause subsequent getopts calls to fail.
    This patch makes dash reset the getopts parameters the same way as OPTIND=1.

    Both behaviours are allowed by POSIX but other common shells do tolerate this
    case.

function                                             old     new   delta
getoptsreset                                          24      30      +6
getoptscmd                                           632     614     -18

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index e30d7fe67f040eb3560cb4d9c16251a103d63264..647fc81b40c2d70d18d88aafa7063de6e5de7040 100644 (file)
@@ -2019,7 +2019,7 @@ extern struct globals_var *const ash_ptr_to_globals_var;
 static void FAST_FUNC
 getoptsreset(const char *value)
 {
-       shellparam.optind = number(value);
+       shellparam.optind = number(value) ?: 1;
        shellparam.optoff = -1;
 }
 #endif
@@ -10571,8 +10571,6 @@ getopts(char *optstr, char *optvar, char **optfirst, int *param_optind, int *opt
 
        sbuf[1] = '\0';
 
-       if (*param_optind < 1)
-               return 1;
        optnext = optfirst + *param_optind - 1;
 
        if (*param_optind <= 1 || *optoff < 0 || (int)strlen(optnext[-1]) < *optoff)