aboutsummaryrefslogtreecommitdiff
path: root/bin/sh/eval.c
diff options
context:
space:
mode:
authorJilles Tjoelker <jilles@FreeBSD.org>2009-12-30 21:46:33 +0000
committerJilles Tjoelker <jilles@FreeBSD.org>2009-12-30 21:46:33 +0000
commit92004afed05c23e12af70a232922fabb1e47fde6 (patch)
tree505629f5123d8b8368522b1237fc949fd103095f /bin/sh/eval.c
parentc7ab66020fb183062ded58a617a6b4979fdd9e63 (diff)
downloadsrc-92004afed05c23e12af70a232922fabb1e47fde6.tar.gz
src-92004afed05c23e12af70a232922fabb1e47fde6.zip
sh: Ensure funcnest is decremented if there was an error in the function.
This will be important when things like 'command eval f' will be possible. Currently, the funcnest = 0 assignment in RESET (called when returning to the top level after an error in interactive mode) is really sufficient.
Notes
Notes: svn path=/head/; revision=201283
Diffstat (limited to 'bin/sh/eval.c')
-rw-r--r--bin/sh/eval.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c
index 7875f822e58b..d5fb5ae6c58e 100644
--- a/bin/sh/eval.c
+++ b/bin/sh/eval.c
@@ -792,20 +792,20 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
unreffunc(cmdentry.u.func);
poplocalvars();
localvars = savelocalvars;
+ funcnest--;
handler = savehandler;
longjmp(handler->loc, 1);
}
handler = &jmploc;
+ funcnest++;
INTON;
for (sp = varlist.list ; sp ; sp = sp->next)
mklocal(sp->text);
- funcnest++;
exitstatus = oexitstatus;
if (flags & EV_TESTED)
evaltree(getfuncnode(cmdentry.u.func), EV_TESTED);
else
evaltree(getfuncnode(cmdentry.u.func), 0);
- funcnest--;
INTOFF;
unreffunc(cmdentry.u.func);
poplocalvars();
@@ -813,6 +813,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
freeparam(&shellparam);
shellparam = saveparam;
handler = savehandler;
+ funcnest--;
popredir();
INTON;
if (evalskip == SKIPFUNC) {