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

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-07-26 20:00:08 +02:00
parent 484fc2056d
commit 85241c7b0b

View File

@ -9539,7 +9539,7 @@ static const struct builtincmd builtintab[] = {
#if ENABLE_FEATURE_SH_MATH #if ENABLE_FEATURE_SH_MATH
{ BUILTIN_NOSPEC "let" , letcmd }, { BUILTIN_NOSPEC "let" , letcmd },
#endif #endif
{ BUILTIN_ASSIGN "local" , localcmd }, { BUILTIN_SPEC_REG_ASSG "local" , localcmd },
#if ENABLE_ASH_PRINTF #if ENABLE_ASH_PRINTF
{ BUILTIN_REGULAR "printf" , printfcmd }, { BUILTIN_REGULAR "printf" , printfcmd },
#endif #endif
@ -9849,9 +9849,11 @@ evalcommand(union node *cmd, int flags)
/* NOTREACHED */ /* NOTREACHED */
} /* default */ } /* default */
case CMDBUILTIN: case CMDBUILTIN:
poplocalvars(spclbltin > 0 || argc == 0); if (spclbltin > 0 || argc == 0) {
if (cmd_is_exec && argc > 1) poplocalvars(1);
listsetvar(varlist.list, VEXPORT); if (cmd_is_exec && argc > 1)
listsetvar(varlist.list, VEXPORT);
}
/* Tight loop with builtins only: /* Tight loop with builtins only:
* "while kill -0 $child; do true; done" * "while kill -0 $child; do true; done"