[git commit] ash: eval: Always set localvar_stop

Denys Vlasenko vda.linux at googlemail.com
Thu Feb 20 09:37:30 UTC 2020


commit: https://git.busybox.net/busybox/commit/?id=e2dd2afc8e4dbcf1061818adc68d2e74a1fa64d3
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at gondor.apana.org.au>

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c | 23 ++++++++++++-----------
 1 file 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...


More information about the busybox-cvs mailing list