diff options
author | Ron Yorston <rmy@pobox.com> | 2021-09-22 10:18:42 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2021-09-22 10:18:42 +0100 |
commit | bcb1d0c76d6e665133d1f878590af2006b31de6e (patch) | |
tree | f445a48264b3e6cdf9cb10e0726b56e2d800963f | |
parent | 90b3ba992ecb39e32e5a66b2e37579becc56d286 (diff) | |
download | busybox-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.c | 5 |
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); |