diff options
author | Ron Yorston <rmy@pobox.com> | 2018-04-01 15:58:32 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2018-04-01 15:58:32 +0100 |
commit | bd68ca428e2e94dcff651fef874576b94f4a3ed3 (patch) | |
tree | b7df36d962c76c04317d0ae684f7c7ce58a4adc0 /shell | |
parent | 372dc3909f49a6e251f49dee353ba9f70f4b19bd (diff) | |
download | busybox-w32-bd68ca428e2e94dcff651fef874576b94f4a3ed3.tar.gz busybox-w32-bd68ca428e2e94dcff651fef874576b94f4a3ed3.tar.bz2 busybox-w32-bd68ca428e2e94dcff651fef874576b94f4a3ed3.zip |
ash: align funcstring handling with upstream
Upstream BusyBox removed the funcstringsize variable. String sizes
are included in funcblocksize then strings are copied into the data
block starting from the end. Do the same here.
Add a function to calculate string lengths, allowing for NULL string
pointers (as nodeckstrup does already for MinGW).
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/shell/ash.c b/shell/ash.c index dfdba9316..78d3d673d 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -9000,9 +9000,9 @@ commandcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | |||
9000 | 9000 | ||
9001 | 9001 | ||
9002 | static int funcblocksize; /* size of structures in function */ | 9002 | static int funcblocksize; /* size of structures in function */ |
9003 | static int funcstringsize; /* size of strings in node */ | 9003 | /*static int funcstringsize; // size of strings in node */ |
9004 | static void *funcblock; /* block to allocate function from */ | 9004 | static void *funcblock; /* block to allocate function from */ |
9005 | static char *funcstring; /* block to allocate strings from */ | 9005 | static char *funcstring_end; /* end of block to allocate strings from */ |
9006 | #if ENABLE_PLATFORM_MINGW32 | 9006 | #if ENABLE_PLATFORM_MINGW32 |
9007 | static int nodeptrcount; | 9007 | static int nodeptrcount; |
9008 | static char **nodeptr; | 9008 | static char **nodeptr; |
@@ -9093,7 +9093,7 @@ calcsize(union node *n) | |||
9093 | IF_PLATFORM_MINGW32(nodeptrcount += 3); | 9093 | IF_PLATFORM_MINGW32(nodeptrcount += 3); |
9094 | break; | 9094 | break; |
9095 | case NFOR: | 9095 | case NFOR: |
9096 | funcstringsize += strlen(n->nfor.var) + 1; | 9096 | funcblocksize += SHELL_ALIGN(strlen(n->nfor.var) + 1); /* was funcstringsize += ... */ |
9097 | calcsize(n->nfor.body); | 9097 | calcsize(n->nfor.body); |
9098 | calcsize(n->nfor.args); | 9098 | calcsize(n->nfor.args); |
9099 | IF_PLATFORM_MINGW32(nodeptrcount += 3); | 9099 | IF_PLATFORM_MINGW32(nodeptrcount += 3); |
@@ -9111,12 +9111,12 @@ calcsize(union node *n) | |||
9111 | break; | 9111 | break; |
9112 | case NDEFUN: | 9112 | case NDEFUN: |
9113 | calcsize(n->ndefun.body); | 9113 | calcsize(n->ndefun.body); |
9114 | funcstringsize += strlen(n->ndefun.text) + 1; | 9114 | funcblocksize += SHELL_ALIGN(strlen(n->ndefun.text) + 1); |
9115 | IF_PLATFORM_MINGW32(nodeptrcount += 2); | 9115 | IF_PLATFORM_MINGW32(nodeptrcount += 2); |
9116 | break; | 9116 | break; |
9117 | case NARG: | 9117 | case NARG: |
9118 | sizenodelist(n->narg.backquote); | 9118 | sizenodelist(n->narg.backquote); |
9119 | funcstringsize += strlen(n->narg.text) + 1; | 9119 | funcblocksize += SHELL_ALIGN(strlen(n->narg.text) + 1); /* was funcstringsize += ... */ |
9120 | calcsize(n->narg.next); | 9120 | calcsize(n->narg.next); |
9121 | IF_PLATFORM_MINGW32(nodeptrcount += 3); | 9121 | IF_PLATFORM_MINGW32(nodeptrcount += 3); |
9122 | break; | 9122 | break; |
@@ -9154,13 +9154,12 @@ calcsize(union node *n) | |||
9154 | static char * | 9154 | static char * |
9155 | nodeckstrdup(const char *s) | 9155 | nodeckstrdup(const char *s) |
9156 | { | 9156 | { |
9157 | char *rtn = funcstring; | 9157 | #if ENABLE_PLATFORM_MINGW32 |
9158 | 9158 | if(!s) | |
9159 | if (!s) | ||
9160 | return NULL; | 9159 | return NULL; |
9161 | strcpy(funcstring, s); | 9160 | #endif |
9162 | funcstring += strlen(s) + 1; | 9161 | funcstring_end -= SHELL_ALIGN(strlen(s) + 1); |
9163 | return rtn; | 9162 | return strcpy(funcstring_end, s); |
9164 | } | 9163 | } |
9165 | 9164 | ||
9166 | static union node *copynode(union node *); | 9165 | static union node *copynode(union node *); |
@@ -9320,15 +9319,15 @@ copyfunc(union node *n) | |||
9320 | size_t blocksize; | 9319 | size_t blocksize; |
9321 | 9320 | ||
9322 | funcblocksize = offsetof(struct funcnode, n); | 9321 | funcblocksize = offsetof(struct funcnode, n); |
9323 | funcstringsize = 0; | 9322 | /*funcstringsize = 0;*/ |
9324 | calcsize(n); | 9323 | calcsize(n); |
9325 | blocksize = funcblocksize; | 9324 | blocksize = funcblocksize; |
9326 | f = ckmalloc(blocksize + funcstringsize); | 9325 | f = ckzalloc(blocksize /* + funcstringsize */); |
9327 | funcblock = (char *) f + offsetof(struct funcnode, n); | 9326 | funcblock = (char *) f + offsetof(struct funcnode, n); |
9328 | funcstring = (char *) f + blocksize; | 9327 | funcstring_end = (char *) f + blocksize; |
9329 | IF_PLATFORM_MINGW32(nodeptr = NULL); | 9328 | IF_PLATFORM_MINGW32(nodeptr = NULL); |
9330 | copynode(n); | 9329 | copynode(n); |
9331 | f->count = 0; | 9330 | /* f->count = 0; - ckzalloc did it */ |
9332 | return f; | 9331 | return f; |
9333 | } | 9332 | } |
9334 | 9333 | ||
@@ -15002,7 +15001,7 @@ spawn_forkshell(struct job *jp, struct forkshell *fs, int mode) | |||
15002 | * forkshell_prepare() and friends | 15001 | * forkshell_prepare() and friends |
15003 | * | 15002 | * |
15004 | * The sequence is as follows: | 15003 | * The sequence is as follows: |
15005 | * - funcblocksize, funcstringsize, nodeptrcount are initialized | 15004 | * - funcblocksize, nodeptrcount are initialized |
15006 | * - forkshell_size(fs) is called to calculate the exact memory needed | 15005 | * - forkshell_size(fs) is called to calculate the exact memory needed |
15007 | * - a new struct is allocated | 15006 | * - a new struct is allocated |
15008 | * - funcblock, funcstring, nodeptr are initialized from the new block | 15007 | * - funcblock, funcstring, nodeptr are initialized from the new block |
@@ -15011,6 +15010,11 @@ spawn_forkshell(struct job *jp, struct forkshell *fs, int mode) | |||
15011 | * | 15010 | * |
15012 | * When this memory is mapped elsewhere, pointer fixup will be needed | 15011 | * When this memory is mapped elsewhere, pointer fixup will be needed |
15013 | */ | 15012 | */ |
15013 | static int align_len(const char *s) | ||
15014 | { | ||
15015 | return s ? SHELL_ALIGN(strlen(s)+1) : 0; | ||
15016 | } | ||
15017 | |||
15014 | #define SLIST_SIZE_BEGIN(name,type) \ | 15018 | #define SLIST_SIZE_BEGIN(name,type) \ |
15015 | static void \ | 15019 | static void \ |
15016 | name(type *p) \ | 15020 | name(type *p) \ |
@@ -15048,7 +15052,7 @@ name(type *vp) \ | |||
15048 | * struct var | 15052 | * struct var |
15049 | */ | 15053 | */ |
15050 | SLIST_SIZE_BEGIN(var_size,struct var) | 15054 | SLIST_SIZE_BEGIN(var_size,struct var) |
15051 | funcstringsize += strlen(p->var_text) + 1; | 15055 | funcblocksize += align_len(p->var_text); |
15052 | nodeptrcount++; /* p->text */ | 15056 | nodeptrcount++; /* p->text */ |
15053 | SLIST_SIZE_END() | 15057 | SLIST_SIZE_END() |
15054 | 15058 | ||
@@ -15063,7 +15067,7 @@ SLIST_COPY_END() | |||
15063 | * struct strlist | 15067 | * struct strlist |
15064 | */ | 15068 | */ |
15065 | SLIST_SIZE_BEGIN(strlist_size,struct strlist) | 15069 | SLIST_SIZE_BEGIN(strlist_size,struct strlist) |
15066 | funcstringsize += strlen(p->text) + 1; | 15070 | funcblocksize += align_len(p->text); |
15067 | nodeptrcount++; /* p->text */ | 15071 | nodeptrcount++; /* p->text */ |
15068 | SLIST_SIZE_END() | 15072 | SLIST_SIZE_END() |
15069 | 15073 | ||
@@ -15159,7 +15163,7 @@ argv_size(char **p) | |||
15159 | { | 15163 | { |
15160 | while (p && *p) { | 15164 | while (p && *p) { |
15161 | funcblocksize += sizeof(char *); | 15165 | funcblocksize += sizeof(char *); |
15162 | funcstringsize += strlen(*p)+1; | 15166 | funcblocksize += align_len(*p); |
15163 | nodeptrcount++; | 15167 | nodeptrcount++; |
15164 | p++; | 15168 | p++; |
15165 | } | 15169 | } |
@@ -15277,12 +15281,12 @@ static void | |||
15277 | globals_misc_size(struct globals_misc *p) | 15281 | globals_misc_size(struct globals_misc *p) |
15278 | { | 15282 | { |
15279 | funcblocksize += sizeof(struct globals_misc); | 15283 | funcblocksize += sizeof(struct globals_misc); |
15280 | funcstringsize += p->minusc ? strlen(p->minusc) + 1 : 1; | 15284 | funcblocksize += align_len(p->minusc); |
15281 | if (p->curdir != p->nullstr) | 15285 | if (p->curdir != p->nullstr) |
15282 | funcstringsize += strlen(p->curdir) + 1; | 15286 | funcblocksize += align_len(p->curdir); |
15283 | if (p->physdir != p->nullstr) | 15287 | if (p->physdir != p->nullstr) |
15284 | funcstringsize += strlen(p->physdir) + 1; | 15288 | funcblocksize += align_len(p->physdir); |
15285 | funcstringsize += strlen(p->arg0) + 1; | 15289 | funcblocksize += align_len(p->arg0); |
15286 | nodeptrcount += 4; /* minusc, curdir, physdir, arg0 */ | 15290 | nodeptrcount += 4; /* minusc, curdir, physdir, arg0 */ |
15287 | } | 15291 | } |
15288 | 15292 | ||
@@ -15313,7 +15317,7 @@ forkshell_size(struct forkshell *fs) | |||
15313 | 15317 | ||
15314 | calcsize(fs->n); | 15318 | calcsize(fs->n); |
15315 | argv_size(fs->argv); | 15319 | argv_size(fs->argv); |
15316 | funcstringsize += (fs->string ? strlen(fs->string) : 0) + 1; | 15320 | funcblocksize += align_len(fs->string); |
15317 | strlist_size(fs->strlist); | 15321 | strlist_size(fs->strlist); |
15318 | 15322 | ||
15319 | nodeptrcount += 7; /* gvp, gmp, cmdtable, n, argv, string, strlist */ | 15323 | nodeptrcount += 7; /* gvp, gmp, cmdtable, n, argv, string, strlist */ |
@@ -15356,10 +15360,9 @@ forkshell_prepare(struct forkshell *fs) | |||
15356 | */ | 15360 | */ |
15357 | nodeptrcount = 0; | 15361 | nodeptrcount = 0; |
15358 | funcblocksize = 0; | 15362 | funcblocksize = 0; |
15359 | funcstringsize = 0; | ||
15360 | forkshell_size(fs); | 15363 | forkshell_size(fs); |
15361 | size = sizeof(struct forkshell) + nodeptrcount*sizeof(char *) + | 15364 | size = sizeof(struct forkshell) + nodeptrcount*sizeof(char *) + |
15362 | funcblocksize + funcstringsize; | 15365 | funcblocksize; |
15363 | 15366 | ||
15364 | /* Allocate, initialize pointers */ | 15367 | /* Allocate, initialize pointers */ |
15365 | memset(&sa, 0, sizeof(sa)); | 15368 | memset(&sa, 0, sizeof(sa)); |
@@ -15370,7 +15373,7 @@ forkshell_prepare(struct forkshell *fs) | |||
15370 | new = (struct forkshell *)MapViewOfFile(h, FILE_MAP_WRITE, 0,0, 0); | 15373 | new = (struct forkshell *)MapViewOfFile(h, FILE_MAP_WRITE, 0,0, 0); |
15371 | nodeptr = new->nodeptr; | 15374 | nodeptr = new->nodeptr; |
15372 | funcblock = (char *)nodeptr + (nodeptrcount+1)*sizeof(char *); | 15375 | funcblock = (char *)nodeptr + (nodeptrcount+1)*sizeof(char *); |
15373 | funcstring = (char *) funcblock + funcblocksize; | 15376 | funcstring_end = (char *)new + size; |
15374 | 15377 | ||
15375 | /* Now pack them all */ | 15378 | /* Now pack them all */ |
15376 | forkshell_copy(fs, new); | 15379 | forkshell_copy(fs, new); |