aboutsummaryrefslogtreecommitdiff
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
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.
-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 */