aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2018-05-31 01:15:34 +0800
committerBen Hutchings <ben@decadent.org.uk>2020-03-28 21:42:55 +0000
commita4d612ae4f36810afb28b497e867714a01cbec82 (patch)
treec96c1f8d1d61d42947f8e45434bb146ae27a07bf
parent527bee886ced0d22428417d60a638521e435bb96 (diff)
downloadklibc-a4d612ae4f36810afb28b497e867714a01cbec82.tar.gz
[klibc] dash: eval: Always set localvar_stop
[ dash commit 42298df5898a62f0df893be3af029d7e981623bd ] 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: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--usr/dash/eval.c9
-rw-r--r--usr/dash/var.c12
-rw-r--r--usr/dash/var.h2
3 files changed, 13 insertions, 10 deletions
diff --git a/usr/dash/eval.c b/usr/dash/eval.c
index 7bb636e141330..6652ccc090b32 100644
--- a/usr/dash/eval.c
+++ b/usr/dash/eval.c
@@ -809,6 +809,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;
@@ -828,7 +830,6 @@ evalcommand(union node *cmd, int flags)
status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH|REDIR_SAVEFD2);
if (unlikely(status)) {
- vlocal = 0;
bail:
exitstatus = status;
@@ -839,9 +840,6 @@ bail:
goto out;
}
- if (likely(vlocal))
- localvar_stop = pushlocalvars();
-
for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) {
struct strlist **spp;
@@ -920,8 +918,7 @@ out:
popredir(execcmd);
unwindredir(redir_stop);
unwindfiles(file_stop);
- if (likely(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...
diff --git a/usr/dash/var.c b/usr/dash/var.c
index 40743e5d019cb..0d7e1db0c1b3b 100644
--- a/usr/dash/var.c
+++ b/usr/dash/var.c
@@ -562,18 +562,24 @@ poplocalvars(int keep)
/*
* Create a new localvar environment.
*/
-struct localvar_list *pushlocalvars(void)
+struct localvar_list *pushlocalvars(int push)
{
struct localvar_list *ll;
+ struct localvar_list *top;
+
+ top = localvar_stack;
+ if (!push)
+ goto out;
INTOFF;
ll = ckmalloc(sizeof(*ll));
ll->lv = NULL;
- ll->next = localvar_stack;
+ ll->next = top;
localvar_stack = ll;
INTON;
- return ll->next;
+out:
+ return top;
}
diff --git a/usr/dash/var.h b/usr/dash/var.h
index 8759be46267b1..e545e02c3cf9e 100644
--- a/usr/dash/var.h
+++ b/usr/dash/var.h
@@ -147,7 +147,7 @@ int showvars(const char *, int, int);
int exportcmd(int, char **);
int localcmd(int, char **);
void mklocal(char *name, int flags);
-struct localvar_list *pushlocalvars(void);
+struct localvar_list *pushlocalvars(int push);
void poplocalvars(int);
void unwindlocalvars(struct localvar_list *stop);
int unsetcmd(int, char **);