aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2019-12-15 10:25:33 +0000
committerRon Yorston <rmy@pobox.com>2019-12-15 10:25:33 +0000
commit5957c8d7b4fc0dfe8def6036e182d3a40ba28cbe (patch)
tree63b794b571747ad52cf0f215a67a28ad5003d25e /shell
parent511eee2272309de282ca889902e14109c538764a (diff)
downloadbusybox-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.c78
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 */
15664SLIST_SIZE_BEGIN(alias_size,struct alias)
15665funcblocksize += align_len(p->name);
15666funcblocksize += align_len(p->val);
15667nodeptrcount += 2;
15668SLIST_SIZE_END()
15669
15670SLIST_COPY_BEGIN(alias_copy,struct alias)
15671(*vpp)->name = nodeckstrdup(vp->name);
15672(*vpp)->val = nodeckstrdup(vp->val);
15673(*vpp)->flag = vp->flag;
15674SAVE_PTR((*vpp)->name);
15675ANNOT_NO_DUP(xasprintf("(*vpp)->name '%s'", vp->name ?: "NULL"));
15676SAVE_PTR((*vpp)->val);
15677ANNOT_NO_DUP(xasprintf("(*vpp)->val '%s'", vp->val ?: "NULL"));
15678SLIST_COPY_END()
15679
15680static int
15681atab_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
15691static struct alias **
15692atab_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