diff options
author | Ron Yorston <rmy@pobox.com> | 2015-07-14 08:24:20 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2015-07-14 08:24:20 +0100 |
commit | 15d4ff620409a738dc8e9f05fd63fbe7fd421c37 (patch) | |
tree | 711831db75eaf9d35f18bbbf8a6a9d0e6f51baa9 /shell | |
parent | b3ef182dbea970c39ddc548706ebd34eb4773ae3 (diff) | |
download | busybox-w32-15d4ff620409a738dc8e9f05fd63fbe7fd421c37.tar.gz busybox-w32-15d4ff620409a738dc8e9f05fd63fbe7fd421c37.tar.bz2 busybox-w32-15d4ff620409a738dc8e9f05fd63fbe7fd421c37.zip |
ash: store pointers to be fixed as pointers, not int
The data block passed during forkshell includes the nodeptr array
of (internal) pointers to (other internal) pointers that need to
be fixed. Store the pointers as pointers, not int.
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/shell/ash.c b/shell/ash.c index afa9f271b..c5b9741d6 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -8308,7 +8308,7 @@ static void *funcblock; /* block to allocate function from */ | |||
8308 | static char *funcstring; /* block to allocate strings from */ | 8308 | static char *funcstring; /* block to allocate strings from */ |
8309 | #if ENABLE_PLATFORM_MINGW32 | 8309 | #if ENABLE_PLATFORM_MINGW32 |
8310 | static int nodeptrsize; | 8310 | static int nodeptrsize; |
8311 | static int *nodeptr; | 8311 | static char **nodeptr; |
8312 | #endif | 8312 | #endif |
8313 | 8313 | ||
8314 | /* flags in argument to evaltree */ | 8314 | /* flags in argument to evaltree */ |
@@ -8470,10 +8470,10 @@ nodeckstrdup(const char *s) | |||
8470 | static union node *copynode(union node *); | 8470 | static union node *copynode(union node *); |
8471 | 8471 | ||
8472 | #if ENABLE_PLATFORM_MINGW32 | 8472 | #if ENABLE_PLATFORM_MINGW32 |
8473 | # define SAVE_PTR(dst) {if (nodeptr) *nodeptr++ = (int)&(dst);} | 8473 | # define SAVE_PTR(dst) {if (nodeptr) *nodeptr++ = (char *)&(dst);} |
8474 | # define SAVE_PTR2(dst1,dst2) {if (nodeptr) { *nodeptr++ = (int)&(dst1);*nodeptr++ = (int)&(dst2);}} | 8474 | # define SAVE_PTR2(dst1,dst2) {if (nodeptr) { *nodeptr++ = (char *)&(dst1);*nodeptr++ = (char *)&(dst2);}} |
8475 | # define SAVE_PTR3(dst1,dst2,dst3) {if (nodeptr) { *nodeptr++ = (int)&(dst1);*nodeptr++ = (int)&(dst2);*nodeptr++ = (int)&(dst3);}} | 8475 | # define SAVE_PTR3(dst1,dst2,dst3) {if (nodeptr) { *nodeptr++ = (char *)&(dst1);*nodeptr++ = (char *)&(dst2);*nodeptr++ = (char *)&(dst3);}} |
8476 | # define SAVE_PTR4(dst1,dst2,dst3,dst4) {if (nodeptr) { *nodeptr++ = (int)&(dst1);*nodeptr++ = (int)&(dst2);*nodeptr++ = (int)&(dst3);*nodeptr++ = (int)&(dst4);}} | 8476 | # define SAVE_PTR4(dst1,dst2,dst3,dst4) {if (nodeptr) { *nodeptr++ = (char *)&(dst1);*nodeptr++ = (char *)&(dst2);*nodeptr++ = (char *)&(dst3);*nodeptr++ = (char *)&(dst4);}} |
8477 | #else | 8477 | #else |
8478 | # define SAVE_PTR(dst) | 8478 | # define SAVE_PTR(dst) |
8479 | # define SAVE_PTR2(dst,dst2) | 8479 | # define SAVE_PTR2(dst,dst2) |
@@ -14392,7 +14392,7 @@ forkshell_prepare(struct forkshell *fs) | |||
14392 | funcblocksize = 0; | 14392 | funcblocksize = 0; |
14393 | funcstringsize = 0; | 14393 | funcstringsize = 0; |
14394 | forkshell_size(fs); | 14394 | forkshell_size(fs); |
14395 | size = funcblocksize + funcstringsize + nodeptrsize*sizeof(int); | 14395 | size = funcblocksize + funcstringsize + nodeptrsize*sizeof(char *); |
14396 | 14396 | ||
14397 | /* Allocate, initialize pointers */ | 14397 | /* Allocate, initialize pointers */ |
14398 | memset(&sa, 0, sizeof(sa)); | 14398 | memset(&sa, 0, sizeof(sa)); |
@@ -14404,14 +14404,14 @@ forkshell_prepare(struct forkshell *fs) | |||
14404 | /* new = ckmalloc(size); */ | 14404 | /* new = ckmalloc(size); */ |
14405 | funcblock = new; | 14405 | funcblock = new; |
14406 | funcstring = (char *) funcblock + funcblocksize; | 14406 | funcstring = (char *) funcblock + funcblocksize; |
14407 | nodeptr = (int*)((char *) funcstring + funcstringsize); | 14407 | nodeptr = (char **)((char *)funcstring + funcstringsize); |
14408 | nodeptr_offset = (int) nodeptr - (int) new; | 14408 | nodeptr_offset = (char *)nodeptr - (char *)new; |
14409 | 14409 | ||
14410 | /* Now pack them all */ | 14410 | /* Now pack them all */ |
14411 | forkshell_copy(fs); | 14411 | forkshell_copy(fs); |
14412 | 14412 | ||
14413 | /* Finish it up */ | 14413 | /* Finish it up */ |
14414 | *nodeptr = 0; | 14414 | *nodeptr = NULL; |
14415 | new->size = size; | 14415 | new->size = size; |
14416 | new->nodeptr_offset = nodeptr_offset; | 14416 | new->nodeptr_offset = nodeptr_offset; |
14417 | new->old_base = new; | 14417 | new->old_base = new; |
@@ -14432,6 +14432,7 @@ forkshell_init(const char *idstr) | |||
14432 | struct globals_var **gvpp; | 14432 | struct globals_var **gvpp; |
14433 | struct globals_misc **gmpp; | 14433 | struct globals_misc **gmpp; |
14434 | int i; | 14434 | int i; |
14435 | char **ptr; | ||
14435 | 14436 | ||
14436 | if (sscanf(idstr, "%x", &map_handle) != 1) | 14437 | if (sscanf(idstr, "%x", &map_handle) != 1) |
14437 | bb_error_msg_and_die("invalid forkshell ID"); | 14438 | bb_error_msg_and_die("invalid forkshell ID"); |
@@ -14444,14 +14445,15 @@ forkshell_init(const char *idstr) | |||
14444 | /* this memory can't be freed */ | 14445 | /* this memory can't be freed */ |
14445 | sticky_mem_start = fs; | 14446 | sticky_mem_start = fs; |
14446 | sticky_mem_end = (char *) fs + fs->size; | 14447 | sticky_mem_end = (char *) fs + fs->size; |
14448 | |||
14447 | /* pointer fixup */ | 14449 | /* pointer fixup */ |
14448 | nodeptr = (int*)((char*)fs + fs->nodeptr_offset); | 14450 | nodeptr = (char **)((char *)fs + fs->nodeptr_offset); |
14449 | while (*nodeptr) { | 14451 | for ( i=0; nodeptr[i]; ++i ) { |
14450 | int *ptr = (int*)((char*)fs + (*nodeptr - (int)fs->old_base)); | 14452 | ptr = (char **)((char *)fs + (nodeptr[i] - (char *)fs->old_base)); |
14451 | if (*ptr) | 14453 | if (*ptr) |
14452 | *ptr -= ((int)fs->old_base - (int)fs); | 14454 | *ptr = (char *)fs + (*ptr - (char *)fs->old_base); |
14453 | nodeptr++; | ||
14454 | } | 14455 | } |
14456 | |||
14455 | /* Now fix up stuff that can't be transferred */ | 14457 | /* Now fix up stuff that can't be transferred */ |
14456 | for (i = 0; i < ARRAY_SIZE(varinit_data); i++) | 14458 | for (i = 0; i < ARRAY_SIZE(varinit_data); i++) |
14457 | fs->gvp->varinit[i].var_func = varinit_data[i].var_func; | 14459 | fs->gvp->varinit[i].var_func = varinit_data[i].var_func; |