From 1f62b5acbe4a6e5c2c1f704ab1dcfd207afe9919 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Mon, 9 Jul 2001 16:20:03 +0000 Subject: Fix function stack unwinding on autoload failures. --- Src/exec.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'Src/exec.c') diff --git a/Src/exec.c b/Src/exec.c index 426d151b5..071dee7cc 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -3264,7 +3264,10 @@ loadautofn(Shfunc shf, int fksh, int autol) execode(prog, 1, 0); shf = (Shfunc) shfunctab->getnode(shfunctab, n); if (!shf || (shf->flags & PM_UNDEFINED)) { + /* We're not actually in the function; decrement locallevel */ + locallevel--; zwarn("%s: function not defined by file", n, 0); + locallevel++; popheap(); return NULL; } @@ -3350,9 +3353,7 @@ doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval) if(++funcdepth > MAX_FUNCTION_DEPTH) { zerr("maximum nested function level reached", NULL, 0); - scriptname = oldscriptname; - popheap(); - return; + goto undoshfunc; } #endif fstack.name = dupstring(name); @@ -3373,15 +3374,15 @@ doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval) errflag = 1; else lastval = 1; - popheap(); - scriptname = oldscriptname; - return; + goto doneshfunc; } prog = shf->funcdef; } runshfunc(prog, wrappers, fstack.name); + doneshfunc: funcstack = fstack.prev; #ifdef MAX_FUNCTION_DEPTH + undoshfunc: --funcdepth; #endif if (retflag) { -- cgit 1.4.1