diff options
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/shell/ash.c b/shell/ash.c index e900a425f..f7fc18f0d 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -9228,7 +9228,7 @@ poplocalvars(int keep) | |||
| 9228 | /* | 9228 | /* |
| 9229 | * Create a new localvar environment. | 9229 | * Create a new localvar environment. |
| 9230 | */ | 9230 | */ |
| 9231 | static void | 9231 | static struct localvar_list * |
| 9232 | pushlocalvars(void) | 9232 | pushlocalvars(void) |
| 9233 | { | 9233 | { |
| 9234 | struct localvar_list *ll; | 9234 | struct localvar_list *ll; |
| @@ -9239,6 +9239,15 @@ pushlocalvars(void) | |||
| 9239 | ll->next = localvar_stack; | 9239 | ll->next = localvar_stack; |
| 9240 | localvar_stack = ll; | 9240 | localvar_stack = ll; |
| 9241 | INT_ON; | 9241 | INT_ON; |
| 9242 | |||
| 9243 | return ll->next; | ||
| 9244 | } | ||
| 9245 | |||
| 9246 | static void | ||
| 9247 | unwindlocalvars(struct localvar_list *stop) | ||
| 9248 | { | ||
| 9249 | while (localvar_stack != stop) | ||
| 9250 | poplocalvars(0); | ||
| 9242 | } | 9251 | } |
| 9243 | 9252 | ||
| 9244 | static int | 9253 | static int |
| @@ -9619,6 +9628,7 @@ evalcommand(union node *cmd, int flags) | |||
| 9619 | static const struct builtincmd null_bltin = { | 9628 | static const struct builtincmd null_bltin = { |
| 9620 | "\0\0", bltincmd /* why three NULs? */ | 9629 | "\0\0", bltincmd /* why three NULs? */ |
| 9621 | }; | 9630 | }; |
| 9631 | struct localvar_list *localvar_stop; | ||
| 9622 | struct stackmark smark; | 9632 | struct stackmark smark; |
| 9623 | union node *argp; | 9633 | union node *argp; |
| 9624 | struct arglist arglist; | 9634 | struct arglist arglist; |
| @@ -9640,7 +9650,7 @@ evalcommand(union node *cmd, int flags) | |||
| 9640 | /* First expand the arguments. */ | 9650 | /* First expand the arguments. */ |
| 9641 | TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags)); | 9651 | TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags)); |
| 9642 | setstackmark(&smark); | 9652 | setstackmark(&smark); |
| 9643 | pushlocalvars(); | 9653 | localvar_stop = pushlocalvars(); |
| 9644 | back_exitstatus = 0; | 9654 | back_exitstatus = 0; |
| 9645 | 9655 | ||
| 9646 | cmdentry.cmdtype = CMDBUILTIN; | 9656 | cmdentry.cmdtype = CMDBUILTIN; |
| @@ -9827,7 +9837,6 @@ evalcommand(union node *cmd, int flags) | |||
| 9827 | /* parent */ | 9837 | /* parent */ |
| 9828 | status = waitforjob(jp); | 9838 | status = waitforjob(jp); |
| 9829 | INT_ON; | 9839 | INT_ON; |
| 9830 | poplocalvars(0); | ||
| 9831 | TRACE(("forked child exited with %d\n", status)); | 9840 | TRACE(("forked child exited with %d\n", status)); |
| 9832 | break; | 9841 | break; |
| 9833 | } | 9842 | } |
| @@ -9874,6 +9883,7 @@ evalcommand(union node *cmd, int flags) | |||
| 9874 | out: | 9883 | out: |
| 9875 | if (cmd->ncmd.redirect) | 9884 | if (cmd->ncmd.redirect) |
| 9876 | popredir(/*drop:*/ cmd_is_exec, /*restore:*/ cmd_is_exec); | 9885 | popredir(/*drop:*/ cmd_is_exec, /*restore:*/ cmd_is_exec); |
| 9886 | unwindlocalvars(localvar_stop); | ||
| 9877 | if (lastarg) { | 9887 | if (lastarg) { |
| 9878 | /* dsl: I think this is intended to be used to support | 9888 | /* dsl: I think this is intended to be used to support |
| 9879 | * '_' in 'vi' command mode during line editing... | 9889 | * '_' in 'vi' command mode during line editing... |
| @@ -13607,8 +13617,7 @@ reset(void) | |||
| 13607 | popredir(/*drop:*/ 0, /*restore:*/ 0); | 13617 | popredir(/*drop:*/ 0, /*restore:*/ 0); |
| 13608 | 13618 | ||
| 13609 | /* from var.c: */ | 13619 | /* from var.c: */ |
| 13610 | while (localvar_stack) | 13620 | unwindlocalvars(NULL); |
| 13611 | poplocalvars(0); | ||
| 13612 | } | 13621 | } |
| 13613 | 13622 | ||
| 13614 | #if PROFILE | 13623 | #if PROFILE |
