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 | ||
