aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c57
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
9002static int funcblocksize; /* size of structures in function */ 9002static int funcblocksize; /* size of structures in function */
9003static int funcstringsize; /* size of strings in node */ 9003/*static int funcstringsize; // size of strings in node */
9004static void *funcblock; /* block to allocate function from */ 9004static void *funcblock; /* block to allocate function from */
9005static char *funcstring; /* block to allocate strings from */ 9005static char *funcstring_end; /* end of block to allocate strings from */
9006#if ENABLE_PLATFORM_MINGW32 9006#if ENABLE_PLATFORM_MINGW32
9007static int nodeptrcount; 9007static int nodeptrcount;
9008static char **nodeptr; 9008static 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)
9154static char * 9154static char *
9155nodeckstrdup(const char *s) 9155nodeckstrdup(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
9166static union node *copynode(union node *); 9165static 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 */
15013static 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) \
15015static void \ 15019static void \
15016name(type *p) \ 15020name(type *p) \
@@ -15048,7 +15052,7 @@ name(type *vp) \
15048 * struct var 15052 * struct var
15049 */ 15053 */
15050SLIST_SIZE_BEGIN(var_size,struct var) 15054SLIST_SIZE_BEGIN(var_size,struct var)
15051funcstringsize += strlen(p->var_text) + 1; 15055funcblocksize += align_len(p->var_text);
15052nodeptrcount++; /* p->text */ 15056nodeptrcount++; /* p->text */
15053SLIST_SIZE_END() 15057SLIST_SIZE_END()
15054 15058
@@ -15063,7 +15067,7 @@ SLIST_COPY_END()
15063 * struct strlist 15067 * struct strlist
15064 */ 15068 */
15065SLIST_SIZE_BEGIN(strlist_size,struct strlist) 15069SLIST_SIZE_BEGIN(strlist_size,struct strlist)
15066funcstringsize += strlen(p->text) + 1; 15070funcblocksize += align_len(p->text);
15067nodeptrcount++; /* p->text */ 15071nodeptrcount++; /* p->text */
15068SLIST_SIZE_END() 15072SLIST_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
15277globals_misc_size(struct globals_misc *p) 15281globals_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);