aboutsummaryrefslogtreecommitdiff
path: root/shell/ash.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2020-02-20 10:33:38 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2020-02-20 10:37:30 +0100
commite2dd2afc8e4dbcf1061818adc68d2e74a1fa64d3 (patch)
tree9dc1fb145d22ad8c80796bc771e43578b899b507 /shell/ash.c
parent3e729102a86b1fb536f61c6ebcd95321ba98528d (diff)
downloadbusybox-e2dd2afc8e4dbcf1061818adc68d2e74a1fa64d3.tar.gz
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>
Diffstat (limited to 'shell/ash.c')
-rw-r--r--shell/ash.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 5bb10e5cb..81d2422d6 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -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,8 +10412,7 @@ evalcommand(union node *cmd, int flags)
popredir(/*drop:*/ cmd_is_exec);
unwindredir(redir_stop);
unwindfiles(file_stop);
- if (vlocal)
- unwindlocalvars(localvar_stop);
+ unwindlocalvars(localvar_stop);
if (lastarg) {
/* dsl: I think this is intended to be used to support
* '_' in 'vi' command mode during line editing...