aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2021-09-22 10:18:42 +0100
committerRon Yorston <rmy@pobox.com>2021-09-22 10:18:42 +0100
commitbcb1d0c76d6e665133d1f878590af2006b31de6e (patch)
treef445a48264b3e6cdf9cb10e0726b56e2d800963f
parent90b3ba992ecb39e32e5a66b2e37579becc56d286 (diff)
downloadbusybox-w32-bcb1d0c76d6e665133d1f878590af2006b31de6e.tar.gz
busybox-w32-bcb1d0c76d6e665133d1f878590af2006b31de6e.tar.bz2
busybox-w32-bcb1d0c76d6e665133d1f878590af2006b31de6e.zip
ash: fix FUNCNAME issue
Commit c13f77823 (ash: adjust reinitvar() to allow for FUNCNAME) was incomplete. It didn't correctly pass the funcname variable during forkshell. This resulted in horrible failure when running a function like: f() { (echo $FUNCNAME); }
-rw-r--r--shell/ash.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 613bb97a0..fafbeb86e 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -16292,6 +16292,7 @@ redirtab_copy(struct redirtab *rdtp)
16292 return start; 16292 return start;
16293} 16293}
16294 16294
16295#undef funcname
16295#undef shellparam 16296#undef shellparam
16296#undef redirlist 16297#undef redirlist
16297#undef vartab 16298#undef vartab
@@ -16301,6 +16302,7 @@ globals_var_size(struct datasize ds, struct globals_var *gvp)
16301 int i; 16302 int i;
16302 16303
16303 ds.funcblocksize += sizeof(struct globals_var); 16304 ds.funcblocksize += sizeof(struct globals_var);
16305 ds.funcstringsize += align_len(gvp->funcname);
16304 ds = argv_size(ds, gvp->shellparam.p); 16306 ds = argv_size(ds, gvp->shellparam.p);
16305 ds.funcblocksize = redirtab_size(ds.funcblocksize, gvp->redirlist); 16307 ds.funcblocksize = redirtab_size(ds.funcblocksize, gvp->redirlist);
16306 for (i = 0; i < VTABSIZE; i++) 16308 for (i = 0; i < VTABSIZE; i++)
@@ -16318,6 +16320,9 @@ globals_var_copy(struct globals_var *gvp)
16318 funcblock = (char *) funcblock + sizeof(struct globals_var); 16320 funcblock = (char *) funcblock + sizeof(struct globals_var);
16319 memcpy(new, gvp, sizeof(struct globals_var)); 16321 memcpy(new, gvp, sizeof(struct globals_var));
16320 16322
16323 new->funcname = nodeckstrdup(gvp->funcname);
16324 SAVE_PTR(new->funcname, xasprintf("funcname '%s'", gvp->funcname ?: "NULL"), FREE);
16325
16321 /* shparam */ 16326 /* shparam */
16322 new->shellparam.malloced = 0; 16327 new->shellparam.malloced = 0;
16323 new->shellparam.p = argv_copy(gvp->shellparam.p); 16328 new->shellparam.p = argv_copy(gvp->shellparam.p);