From 85241c7b0b4558f405f7e633ad62520299b8396d Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 26 Jul 2017 20:00:08 +0200 Subject: [PATCH] ash: [VAR] Do not poplocalvars prematurely on regular utilities Upstream commit: Date: Thu, 27 May 2010 11:50:19 +0800 [VAR] Do not poplocalvars prematurely on regular utilities The recent cmdenviron removal broke regular utilities by calling poplocalvars too early. This patch fixes that by postponing the poplocalvars for regular utilities until they have completed. In order to ensure that local still works, it is now a special built-in. Signed-off-by: Herbert Xu Signed-off-by: Denys Vlasenko --- shell/ash.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/shell/ash.c b/shell/ash.c index f7fc18f0d..3604af4fc 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -9539,7 +9539,7 @@ static const struct builtincmd builtintab[] = { #if ENABLE_FEATURE_SH_MATH { BUILTIN_NOSPEC "let" , letcmd }, #endif - { BUILTIN_ASSIGN "local" , localcmd }, + { BUILTIN_SPEC_REG_ASSG "local" , localcmd }, #if ENABLE_ASH_PRINTF { BUILTIN_REGULAR "printf" , printfcmd }, #endif @@ -9849,9 +9849,11 @@ evalcommand(union node *cmd, int flags) /* NOTREACHED */ } /* default */ case CMDBUILTIN: - poplocalvars(spclbltin > 0 || argc == 0); - if (cmd_is_exec && argc > 1) - listsetvar(varlist.list, VEXPORT); + if (spclbltin > 0 || argc == 0) { + poplocalvars(1); + if (cmd_is_exec && argc > 1) + listsetvar(varlist.list, VEXPORT); + } /* Tight loop with builtins only: * "while kill -0 $child; do true; done"