aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2018-12-04 09:54:49 +0000
committerRon Yorston <rmy@pobox.com>2018-12-04 09:54:49 +0000
commit2bea24120ba728153a6bf94a5fed0f226e8bf438 (patch)
treecca0cc210de589e33ef161e034c8d833b467d120 /shell
parent3d94569bbeed8f90ec36cea7d7f3f8f9077b1657 (diff)
downloadbusybox-w32-2bea24120ba728153a6bf94a5fed0f226e8bf438.tar.gz
busybox-w32-2bea24120ba728153a6bf94a5fed0f226e8bf438.tar.bz2
busybox-w32-2bea24120ba728153a6bf94a5fed0f226e8bf438.zip
ash: forkshell tweaks
Make it explicit that the nodeptr array contains pointers to pointers. In debug output show both the location of pointers to be fixed and their contents.
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/shell/ash.c b/shell/ash.c
index bf197cd70..4c23286c1 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -344,7 +344,7 @@ struct forkshell {
344 /* struct alias **atab; */ 344 /* struct alias **atab; */
345 /* struct parsefile *g_parsefile; */ 345 /* struct parsefile *g_parsefile; */
346 HANDLE hMapFile; 346 HANDLE hMapFile;
347 void *old_base; 347 char *old_base;
348# if FORKSHELL_DEBUG 348# if FORKSHELL_DEBUG
349 int nodeptrcount; 349 int nodeptrcount;
350 int funcblocksize; 350 int funcblocksize;
@@ -364,7 +364,7 @@ struct forkshell {
364 struct strlist *varlist; 364 struct strlist *varlist;
365 365
366 /* start of data block */ 366 /* start of data block */
367 char *nodeptr[1]; 367 char **nodeptr[1];
368}; 368};
369 369
370enum { 370enum {
@@ -9081,7 +9081,7 @@ static void *funcblock; /* block to allocate function from */
9081static char *funcstring_end; /* end of block to allocate strings from */ 9081static char *funcstring_end; /* end of block to allocate strings from */
9082#if ENABLE_PLATFORM_MINGW32 9082#if ENABLE_PLATFORM_MINGW32
9083static int nodeptrcount; 9083static int nodeptrcount;
9084static char **nodeptr; 9084static char ***nodeptr;
9085# if FORKSHELL_DEBUG 9085# if FORKSHELL_DEBUG
9086static int annot_count; 9086static int annot_count;
9087static char **annot; 9087static char **annot;
@@ -9247,9 +9247,9 @@ nodeckstrdup(const char *s)
9247static union node *copynode(union node *); 9247static union node *copynode(union node *);
9248 9248
9249#if ENABLE_PLATFORM_MINGW32 9249#if ENABLE_PLATFORM_MINGW32
9250# define SAVE_PTR(dst) {if (nodeptr) *nodeptr++ = (char *)&(dst);} 9250# define SAVE_PTR(dst) {if (nodeptr) *nodeptr++ = (char **)&(dst);}
9251# define SAVE_PTR2(dst1,dst2) {if (nodeptr) { *nodeptr++ = (char *)&(dst1);*nodeptr++ = (char *)&(dst2);}} 9251# define SAVE_PTR2(dst1,dst2) {if (nodeptr) { *nodeptr++ = (char **)&(dst1);*nodeptr++ = (char **)&(dst2);}}
9252# define SAVE_PTR3(dst1,dst2,dst3) {if (nodeptr) { *nodeptr++ = (char *)&(dst1);*nodeptr++ = (char *)&(dst2);*nodeptr++ = (char *)&(dst3);}} 9252# define SAVE_PTR3(dst1,dst2,dst3) {if (nodeptr) { *nodeptr++ = (char **)&(dst1);*nodeptr++ = (char **)&(dst2);*nodeptr++ = (char **)&(dst3);}}
9253#else 9253#else
9254# define SAVE_PTR(dst) 9254# define SAVE_PTR(dst)
9255# define SAVE_PTR2(dst,dst2) 9255# define SAVE_PTR2(dst,dst2)
@@ -15174,7 +15174,7 @@ spawn_forkshell(struct job *jp, struct forkshell *fs, int mode)
15174#undef SAVE_PTR 15174#undef SAVE_PTR
15175#undef SAVE_PTR2 15175#undef SAVE_PTR2
15176#undef SAVE_PTR3 15176#undef SAVE_PTR3
15177#define SAVE_PTR(dst) {*nodeptr++ = (char *)&(dst);} 15177#define SAVE_PTR(dst) {*nodeptr++ = (char **)&(dst);}
15178#define SAVE_PTR2(dst1,dst2) {SAVE_PTR(dst1); SAVE_PTR(dst2);} 15178#define SAVE_PTR2(dst1,dst2) {SAVE_PTR(dst1); SAVE_PTR(dst2);}
15179#define SAVE_PTR3(dst1,dst2,dst3) {SAVE_PTR2(dst1,dst2); SAVE_PTR(dst3);} 15179#define SAVE_PTR3(dst1,dst2,dst3) {SAVE_PTR2(dst1,dst2); SAVE_PTR(dst3);}
15180#define SAVE_PTR4(dst1,dst2,dst3,dst4) {SAVE_PTR2(dst1,dst2); SAVE_PTR2(dst3,dst4);} 15180#define SAVE_PTR4(dst1,dst2,dst3,dst4) {SAVE_PTR2(dst1,dst2); SAVE_PTR2(dst3,dst4);}
@@ -15544,7 +15544,7 @@ forkshell_print(FILE *fp0, struct forkshell *fs, char **notes)
15544 FILE *fp; 15544 FILE *fp;
15545 void *lfuncblock; 15545 void *lfuncblock;
15546 char *lfuncstring; 15546 char *lfuncstring;
15547 char **lnodeptr; 15547 char ***lnodeptr;
15548 char *s; 15548 char *s;
15549 int count; 15549 int count;
15550 15550
@@ -15586,7 +15586,8 @@ forkshell_print(FILE *fp0, struct forkshell *fs, char **notes)
15586 } 15586 }
15587 else { 15587 else {
15588 while (*lnodeptr) { 15588 while (*lnodeptr) {
15589 fprintf(fp, "%p %s\n", *lnodeptr++, notes[count++]); 15589 fprintf(fp, "%p %p %s\n", *lnodeptr, **lnodeptr, notes[count++]);
15590 lnodeptr++;
15590 } 15591 }
15591 } 15592 }
15592 if (count != fs->nodeptrcount) 15593 if (count != fs->nodeptrcount)
@@ -15665,7 +15666,7 @@ forkshell_prepare(struct forkshell *fs)
15665 /* Finish it up */ 15666 /* Finish it up */
15666 *nodeptr = NULL; 15667 *nodeptr = NULL;
15667 new->size = size; 15668 new->size = size;
15668 new->old_base = new; 15669 new->old_base = (char *)new;
15669 new->hMapFile = h; 15670 new->hMapFile = h;
15670#if FORKSHELL_DEBUG 15671#if FORKSHELL_DEBUG
15671 sprintf(name, "fs_%d.out", getpid()); 15672 sprintf(name, "fs_%d.out", getpid());
@@ -15736,9 +15737,9 @@ forkshell_init(const char *idstr)
15736 15737
15737 /* pointer fixup */ 15738 /* pointer fixup */
15738 for ( i=0; fs->nodeptr[i]; ++i ) { 15739 for ( i=0; fs->nodeptr[i]; ++i ) {
15739 ptr = (char **)((char *)fs + (fs->nodeptr[i] - (char *)fs->old_base)); 15740 ptr = (char **)((char *)fs + ((char *)fs->nodeptr[i] - fs->old_base));
15740 if (*ptr) 15741 if (*ptr)
15741 *ptr = (char *)fs + (*ptr - (char *)fs->old_base); 15742 *ptr = (char *)fs + (*ptr - fs->old_base);
15742 } 15743 }
15743 15744
15744 /* Now fix up stuff that can't be transferred */ 15745 /* Now fix up stuff that can't be transferred */