ash: eval: Always set localvar_stop

Upstream commit:

    Date: Thu, 31 May 2018 01:15:34 +0800
    eval: Always set localvar_stop

    The variable localvar_stop is set iff vlocal is true.  gcc doesn't
    get this so we get a spurious warning.

    This patch fixes this by always calling pushlocalvars with vlocal
    and making it only actually do the push if vlocal is non-zero.

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

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2020-02-20 10:33:38 +01:00
parent 3e729102a8
commit e2dd2afc8e

View File

@ -9722,18 +9722,23 @@ poplocalvars(int keep)
* Create a new localvar environment.
*/
static struct localvar_list *
pushlocalvars(void)
pushlocalvars(int push)
{
struct localvar_list *ll;
struct localvar_list *top;
top = localvar_stack;
if (!push)
goto out;
INT_OFF;
ll = ckzalloc(sizeof(*ll));
/*ll->lv = NULL; - zalloc did it */
ll->next = localvar_stack;
ll->next = top;
localvar_stack = ll;
INT_ON;
return ll->next;
out:
return top;
}
static void
@ -10217,6 +10222,8 @@ evalcommand(union node *cmd, int flags)
vflags = VEXPORT;
}
localvar_stop = pushlocalvars(vlocal);
/* Reserve one extra spot at the front for shellexec. */
nargv = stalloc(sizeof(char *) * (argc + 2));
argv = ++nargv;
@ -10245,7 +10252,6 @@ evalcommand(union node *cmd, int flags)
status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH | REDIR_SAVEFD2);
if (status) {
vlocal = 0;
bail:
exitstatus = status;
@ -10256,10 +10262,6 @@ evalcommand(union node *cmd, int flags)
goto out;
}
localvar_stop = NULL;
if (vlocal)
localvar_stop = pushlocalvars();
for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) {
struct strlist **spp;
@ -10410,7 +10412,6 @@ evalcommand(union node *cmd, int flags)
popredir(/*drop:*/ cmd_is_exec);
unwindredir(redir_stop);
unwindfiles(file_stop);
if (vlocal)
unwindlocalvars(localvar_stop);
if (lastarg) {
/* dsl: I think this is intended to be used to support