diff options
author | Ron Yorston <rmy@pobox.com> | 2019-12-15 10:25:33 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2019-12-15 10:25:33 +0000 |
commit | 5957c8d7b4fc0dfe8def6036e182d3a40ba28cbe (patch) | |
tree | 63b794b571747ad52cf0f215a67a28ad5003d25e /shell | |
parent | 511eee2272309de282ca889902e14109c538764a (diff) | |
download | busybox-w32-5957c8d7b4fc0dfe8def6036e182d3a40ba28cbe.tar.gz busybox-w32-5957c8d7b4fc0dfe8def6036e182d3a40ba28cbe.tar.bz2 busybox-w32-5957c8d7b4fc0dfe8def6036e182d3a40ba28cbe.zip |
ash: copy alias table during forkshell
The alias table has never been copied during forkshell. As a result
any attempts to use the alias command in conjunction with pipes or
backquote expansion, for example, fail.
Fix this by adding the necessary code.
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/shell/ash.c b/shell/ash.c index 407a0304c..a45441877 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -350,7 +350,9 @@ struct forkshell { | |||
350 | struct globals_var *gvp; | 350 | struct globals_var *gvp; |
351 | struct globals_misc *gmp; | 351 | struct globals_misc *gmp; |
352 | struct tblentry **cmdtable; | 352 | struct tblentry **cmdtable; |
353 | /* struct alias **atab; */ | 353 | #if ENABLE_ASH_ALIAS |
354 | struct alias **atab; | ||
355 | #endif | ||
354 | /* struct parsefile *g_parsefile; */ | 356 | /* struct parsefile *g_parsefile; */ |
355 | HANDLE hMapFile; | 357 | HANDLE hMapFile; |
356 | char *old_base; | 358 | char *old_base; |
@@ -15655,6 +15657,53 @@ cmdtable_copy(struct tblentry **cmdtablep) | |||
15655 | return new; | 15657 | return new; |
15656 | } | 15658 | } |
15657 | 15659 | ||
15660 | #if ENABLE_ASH_ALIAS | ||
15661 | /* | ||
15662 | * struct alias | ||
15663 | */ | ||
15664 | SLIST_SIZE_BEGIN(alias_size,struct alias) | ||
15665 | funcblocksize += align_len(p->name); | ||
15666 | funcblocksize += align_len(p->val); | ||
15667 | nodeptrcount += 2; | ||
15668 | SLIST_SIZE_END() | ||
15669 | |||
15670 | SLIST_COPY_BEGIN(alias_copy,struct alias) | ||
15671 | (*vpp)->name = nodeckstrdup(vp->name); | ||
15672 | (*vpp)->val = nodeckstrdup(vp->val); | ||
15673 | (*vpp)->flag = vp->flag; | ||
15674 | SAVE_PTR((*vpp)->name); | ||
15675 | ANNOT_NO_DUP(xasprintf("(*vpp)->name '%s'", vp->name ?: "NULL")); | ||
15676 | SAVE_PTR((*vpp)->val); | ||
15677 | ANNOT_NO_DUP(xasprintf("(*vpp)->val '%s'", vp->val ?: "NULL")); | ||
15678 | SLIST_COPY_END() | ||
15679 | |||
15680 | static int | ||
15681 | atab_size(int funcblocksize, struct alias **atabp) | ||
15682 | { | ||
15683 | int i; | ||
15684 | nodeptrcount += ATABSIZE; | ||
15685 | funcblocksize += sizeof(struct alias *)*ATABSIZE; | ||
15686 | for (i = 0; i < ATABSIZE; i++) | ||
15687 | funcblocksize = alias_size(funcblocksize, atabp[i]); | ||
15688 | return funcblocksize; | ||
15689 | } | ||
15690 | |||
15691 | static struct alias ** | ||
15692 | atab_copy(struct alias **atabp) | ||
15693 | { | ||
15694 | struct alias **new = funcblock; | ||
15695 | int i; | ||
15696 | |||
15697 | funcblock = (char *) funcblock + sizeof(struct alias *)*ATABSIZE; | ||
15698 | for (i = 0; i < ATABSIZE; i++) { | ||
15699 | new[i] = alias_copy(atabp[i]); | ||
15700 | SAVE_PTR(new[i]); | ||
15701 | ANNOT_NO_DUP(xasprintf("atabp[%d]", i)); | ||
15702 | } | ||
15703 | return new; | ||
15704 | } | ||
15705 | #endif | ||
15706 | |||
15658 | /* | 15707 | /* |
15659 | * char ** | 15708 | * char ** |
15660 | */ | 15709 | */ |
@@ -15826,6 +15875,9 @@ forkshell_size(int funcblocksize, struct forkshell *fs) | |||
15826 | funcblocksize = globals_var_size(funcblocksize, fs->gvp); | 15875 | funcblocksize = globals_var_size(funcblocksize, fs->gvp); |
15827 | funcblocksize = globals_misc_size(funcblocksize, fs->gmp); | 15876 | funcblocksize = globals_misc_size(funcblocksize, fs->gmp); |
15828 | funcblocksize = cmdtable_size(funcblocksize, fs->cmdtable); | 15877 | funcblocksize = cmdtable_size(funcblocksize, fs->cmdtable); |
15878 | #if ENABLE_ASH_ALIAS | ||
15879 | funcblocksize = atab_size(funcblocksize, fs->atab); | ||
15880 | #endif | ||
15829 | /* optlist_transfer(sending, fd); */ | 15881 | /* optlist_transfer(sending, fd); */ |
15830 | /* misc_transfer(sending, fd); */ | 15882 | /* misc_transfer(sending, fd); */ |
15831 | 15883 | ||
@@ -15834,7 +15886,11 @@ forkshell_size(int funcblocksize, struct forkshell *fs) | |||
15834 | funcblocksize += align_len(fs->path); | 15886 | funcblocksize += align_len(fs->path); |
15835 | funcblocksize = strlist_size(funcblocksize, fs->varlist); | 15887 | funcblocksize = strlist_size(funcblocksize, fs->varlist); |
15836 | 15888 | ||
15889 | #if ENABLE_ASH_ALIAS | ||
15890 | nodeptrcount += 8; /* gvp, gmp, cmdtable, atab, n, argv, string, strlist */ | ||
15891 | #else | ||
15837 | nodeptrcount += 7; /* gvp, gmp, cmdtable, n, argv, string, strlist */ | 15892 | nodeptrcount += 7; /* gvp, gmp, cmdtable, n, argv, string, strlist */ |
15893 | #endif | ||
15838 | return funcblocksize; | 15894 | return funcblocksize; |
15839 | } | 15895 | } |
15840 | 15896 | ||
@@ -15845,8 +15901,14 @@ forkshell_copy(struct forkshell *fs, struct forkshell *new) | |||
15845 | new->gvp = globals_var_copy(fs->gvp); | 15901 | new->gvp = globals_var_copy(fs->gvp); |
15846 | new->gmp = globals_misc_copy(fs->gmp); | 15902 | new->gmp = globals_misc_copy(fs->gmp); |
15847 | new->cmdtable = cmdtable_copy(fs->cmdtable); | 15903 | new->cmdtable = cmdtable_copy(fs->cmdtable); |
15904 | #if ENABLE_ASH_ALIAS | ||
15905 | new->atab = atab_copy(fs->atab); | ||
15906 | SAVE_PTR4(new->gvp, new->gmp, new->cmdtable, new->atab); | ||
15907 | ANNOT4("gvp", "gmp", "cmdtable", "atab"); | ||
15908 | #else | ||
15848 | SAVE_PTR3(new->gvp, new->gmp, new->cmdtable); | 15909 | SAVE_PTR3(new->gvp, new->gmp, new->cmdtable); |
15849 | ANNOT3("gvp", "gmp", "cmdtable"); | 15910 | ANNOT3("gvp", "gmp", "cmdtable"); |
15911 | #endif | ||
15850 | 15912 | ||
15851 | new->n = copynode(fs->n); | 15913 | new->n = copynode(fs->n); |
15852 | new->argv = argv_copy(fs->argv); | 15914 | new->argv = argv_copy(fs->argv); |
@@ -15889,10 +15951,18 @@ forkshell_print(FILE *fp0, struct forkshell *fs, char **notes) | |||
15889 | lfuncblock = (char *)lnodeptr + (fs->nodeptrcount+1)*sizeof(char *); | 15951 | lfuncblock = (char *)lnodeptr + (fs->nodeptrcount+1)*sizeof(char *); |
15890 | lfuncstring = (char *)lfuncblock + fs->funcblocksize; | 15952 | lfuncstring = (char *)lfuncblock + fs->funcblocksize; |
15891 | 15953 | ||
15954 | #if ENABLE_ASH_ALIAS | ||
15955 | fprintf(fp, "funcblocksize %d = %d + %d + %d + %d\n\n", fs->funcblocksize, | ||
15956 | (int)((char *)fs->gmp-(char *)fs->gvp), | ||
15957 | (int)((char *)fs->cmdtable-(char *)fs->gmp), | ||
15958 | (int)((char *)fs->atab-(char *)fs->cmdtable), | ||
15959 | (int)(lfuncstring-(char *)fs->atab)); | ||
15960 | #else | ||
15892 | fprintf(fp, "funcblocksize %d = %d + %d + %d\n\n", fs->funcblocksize, | 15961 | fprintf(fp, "funcblocksize %d = %d + %d + %d\n\n", fs->funcblocksize, |
15893 | (int)((char *)fs->gmp-(char *)fs->gvp), | 15962 | (int)((char *)fs->gmp-(char *)fs->gvp), |
15894 | (int)((char *)fs->cmdtable-(char *)fs->gmp), | 15963 | (int)((char *)fs->cmdtable-(char *)fs->gmp), |
15895 | (int)(lfuncstring-(char *)fs->cmdtable)); | 15964 | (int)(lfuncstring-(char *)fs->cmdtable)); |
15965 | #endif | ||
15896 | 15966 | ||
15897 | fprintf(fp, "--- nodeptr ---\n"); | 15967 | fprintf(fp, "--- nodeptr ---\n"); |
15898 | count = 0; | 15968 | count = 0; |
@@ -15955,6 +16025,9 @@ forkshell_prepare(struct forkshell *fs) | |||
15955 | fs->gvp = ash_ptr_to_globals_var; | 16025 | fs->gvp = ash_ptr_to_globals_var; |
15956 | fs->gmp = ash_ptr_to_globals_misc; | 16026 | fs->gmp = ash_ptr_to_globals_misc; |
15957 | fs->cmdtable = cmdtable; | 16027 | fs->cmdtable = cmdtable; |
16028 | #if ENABLE_ASH_ALIAS | ||
16029 | fs->atab = atab; | ||
16030 | #endif | ||
15958 | 16031 | ||
15959 | /* | 16032 | /* |
15960 | * Careful: much scope for off-by-one errors. nodeptrcount is the | 16033 | * Careful: much scope for off-by-one errors. nodeptrcount is the |
@@ -16084,6 +16157,9 @@ forkshell_init(const char *idstr) | |||
16084 | gmpp = (struct globals_misc **)&ash_ptr_to_globals_misc; | 16157 | gmpp = (struct globals_misc **)&ash_ptr_to_globals_misc; |
16085 | *gmpp = fs->gmp; | 16158 | *gmpp = fs->gmp; |
16086 | cmdtable = fs->cmdtable; | 16159 | cmdtable = fs->cmdtable; |
16160 | #if ENABLE_ASH_ALIAS | ||
16161 | atab = fs->atab; | ||
16162 | #endif | ||
16087 | 16163 | ||
16088 | CLEAR_RANDOM_T(&random_gen); /* or else $RANDOM repeats in child */ | 16164 | CLEAR_RANDOM_T(&random_gen); /* or else $RANDOM repeats in child */ |
16089 | 16165 | ||