diff options
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/shell/ash.c b/shell/ash.c index d4b60f081..c99a1351f 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -8012,6 +8012,10 @@ static int funcblocksize; /* size of structures in function */ | |||
| 8012 | static int funcstringsize; /* size of strings in node */ | 8012 | static int funcstringsize; /* size of strings in node */ |
| 8013 | static void *funcblock; /* block to allocate function from */ | 8013 | static void *funcblock; /* block to allocate function from */ |
| 8014 | static char *funcstring; /* block to allocate strings from */ | 8014 | static char *funcstring; /* block to allocate strings from */ |
| 8015 | #if ENABLE_PLATFORM_MINGW32 | ||
| 8016 | static int nodeptrsize; | ||
| 8017 | static int *nodeptr; | ||
| 8018 | #endif | ||
| 8015 | 8019 | ||
| 8016 | /* flags in argument to evaltree */ | 8020 | /* flags in argument to evaltree */ |
| 8017 | #define EV_EXIT 01 /* exit after evaluating tree */ | 8021 | #define EV_EXIT 01 /* exit after evaluating tree */ |
| @@ -8057,6 +8061,7 @@ sizenodelist(struct nodelist *lp) | |||
| 8057 | { | 8061 | { |
| 8058 | while (lp) { | 8062 | while (lp) { |
| 8059 | funcblocksize += SHELL_ALIGN(sizeof(struct nodelist)); | 8063 | funcblocksize += SHELL_ALIGN(sizeof(struct nodelist)); |
| 8064 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
| 8060 | calcsize(lp->n); | 8065 | calcsize(lp->n); |
| 8061 | lp = lp->next; | 8066 | lp = lp->next; |
| 8062 | } | 8067 | } |
| @@ -8073,15 +8078,18 @@ calcsize(union node *n) | |||
| 8073 | calcsize(n->ncmd.redirect); | 8078 | calcsize(n->ncmd.redirect); |
| 8074 | calcsize(n->ncmd.args); | 8079 | calcsize(n->ncmd.args); |
| 8075 | calcsize(n->ncmd.assign); | 8080 | calcsize(n->ncmd.assign); |
| 8081 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
| 8076 | break; | 8082 | break; |
| 8077 | case NPIPE: | 8083 | case NPIPE: |
| 8078 | sizenodelist(n->npipe.cmdlist); | 8084 | sizenodelist(n->npipe.cmdlist); |
| 8085 | IF_PLATFORM_MINGW32(nodeptrsize++); | ||
| 8079 | break; | 8086 | break; |
| 8080 | case NREDIR: | 8087 | case NREDIR: |
| 8081 | case NBACKGND: | 8088 | case NBACKGND: |
| 8082 | case NSUBSHELL: | 8089 | case NSUBSHELL: |
| 8083 | calcsize(n->nredir.redirect); | 8090 | calcsize(n->nredir.redirect); |
| 8084 | calcsize(n->nredir.n); | 8091 | calcsize(n->nredir.n); |
| 8092 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
| 8085 | break; | 8093 | break; |
| 8086 | case NAND: | 8094 | case NAND: |
| 8087 | case NOR: | 8095 | case NOR: |
| @@ -8090,31 +8098,37 @@ calcsize(union node *n) | |||
| 8090 | case NUNTIL: | 8098 | case NUNTIL: |
| 8091 | calcsize(n->nbinary.ch2); | 8099 | calcsize(n->nbinary.ch2); |
| 8092 | calcsize(n->nbinary.ch1); | 8100 | calcsize(n->nbinary.ch1); |
| 8101 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
| 8093 | break; | 8102 | break; |
| 8094 | case NIF: | 8103 | case NIF: |
| 8095 | calcsize(n->nif.elsepart); | 8104 | calcsize(n->nif.elsepart); |
| 8096 | calcsize(n->nif.ifpart); | 8105 | calcsize(n->nif.ifpart); |
| 8097 | calcsize(n->nif.test); | 8106 | calcsize(n->nif.test); |
| 8107 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
| 8098 | break; | 8108 | break; |
| 8099 | case NFOR: | 8109 | case NFOR: |
| 8100 | funcstringsize += strlen(n->nfor.var) + 1; | 8110 | funcstringsize += strlen(n->nfor.var) + 1; |
| 8101 | calcsize(n->nfor.body); | 8111 | calcsize(n->nfor.body); |
| 8102 | calcsize(n->nfor.args); | 8112 | calcsize(n->nfor.args); |
| 8113 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
| 8103 | break; | 8114 | break; |
| 8104 | case NCASE: | 8115 | case NCASE: |
| 8105 | calcsize(n->ncase.cases); | 8116 | calcsize(n->ncase.cases); |
| 8106 | calcsize(n->ncase.expr); | 8117 | calcsize(n->ncase.expr); |
| 8118 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
| 8107 | break; | 8119 | break; |
| 8108 | case NCLIST: | 8120 | case NCLIST: |
| 8109 | calcsize(n->nclist.body); | 8121 | calcsize(n->nclist.body); |
| 8110 | calcsize(n->nclist.pattern); | 8122 | calcsize(n->nclist.pattern); |
| 8111 | calcsize(n->nclist.next); | 8123 | calcsize(n->nclist.next); |
| 8124 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
| 8112 | break; | 8125 | break; |
| 8113 | case NDEFUN: | 8126 | case NDEFUN: |
| 8114 | case NARG: | 8127 | case NARG: |
| 8115 | sizenodelist(n->narg.backquote); | 8128 | sizenodelist(n->narg.backquote); |
| 8116 | funcstringsize += strlen(n->narg.text) + 1; | 8129 | funcstringsize += strlen(n->narg.text) + 1; |
| 8117 | calcsize(n->narg.next); | 8130 | calcsize(n->narg.next); |
| 8131 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
| 8118 | break; | 8132 | break; |
| 8119 | case NTO: | 8133 | case NTO: |
| 8120 | #if ENABLE_ASH_BASH_COMPAT | 8134 | #if ENABLE_ASH_BASH_COMPAT |
| @@ -8126,19 +8140,23 @@ calcsize(union node *n) | |||
| 8126 | case NAPPEND: | 8140 | case NAPPEND: |
| 8127 | calcsize(n->nfile.fname); | 8141 | calcsize(n->nfile.fname); |
| 8128 | calcsize(n->nfile.next); | 8142 | calcsize(n->nfile.next); |
| 8143 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
| 8129 | break; | 8144 | break; |
| 8130 | case NTOFD: | 8145 | case NTOFD: |
| 8131 | case NFROMFD: | 8146 | case NFROMFD: |
| 8132 | calcsize(n->ndup.vname); | 8147 | calcsize(n->ndup.vname); |
| 8133 | calcsize(n->ndup.next); | 8148 | calcsize(n->ndup.next); |
| 8149 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
| 8134 | break; | 8150 | break; |
| 8135 | case NHERE: | 8151 | case NHERE: |
| 8136 | case NXHERE: | 8152 | case NXHERE: |
| 8137 | calcsize(n->nhere.doc); | 8153 | calcsize(n->nhere.doc); |
| 8138 | calcsize(n->nhere.next); | 8154 | calcsize(n->nhere.next); |
| 8155 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
| 8139 | break; | 8156 | break; |
| 8140 | case NNOT: | 8157 | case NNOT: |
| 8141 | calcsize(n->nnot.com); | 8158 | calcsize(n->nnot.com); |
| 8159 | IF_PLATFORM_MINGW32(nodeptrsize++); | ||
| 8142 | break; | 8160 | break; |
| 8143 | }; | 8161 | }; |
| 8144 | } | 8162 | } |
| @@ -8157,6 +8175,18 @@ nodeckstrdup(const char *s) | |||
| 8157 | 8175 | ||
| 8158 | static union node *copynode(union node *); | 8176 | static union node *copynode(union node *); |
| 8159 | 8177 | ||
| 8178 | #if ENABLE_PLATFORM_MINGW32 | ||
| 8179 | # define SAVE_PTR(dst) {if (nodeptr) *nodeptr++ = (int)&(dst);} | ||
| 8180 | # define SAVE_PTR2(dst1,dst2) {if (nodeptr) { *nodeptr++ = (int)&(dst1);*nodeptr++ = (int)&(dst2);}} | ||
| 8181 | # define SAVE_PTR3(dst1,dst2,dst3) {if (nodeptr) { *nodeptr++ = (int)&(dst1);*nodeptr++ = (int)&(dst2);*nodeptr++ = (int)&(dst3);}} | ||
| 8182 | # define SAVE_PTR4(dst1,dst2,dst3,dst4) {if (nodeptr) { *nodeptr++ = (int)&(dst1);*nodeptr++ = (int)&(dst2);*nodeptr++ = (int)&(dst3);*nodeptr++ = (int)&(dst4);}} | ||
| 8183 | #else | ||
| 8184 | # define SAVE_PTR(dst) | ||
| 8185 | # define SAVE_PTR2(dst,dst2) | ||
| 8186 | # define SAVE_PTR3(dst,dst2,dst3) | ||
| 8187 | # define SAVE_PTR4(dst,dst2,dst3,dst4) | ||
| 8188 | #endif | ||
| 8189 | |||
| 8160 | static struct nodelist * | 8190 | static struct nodelist * |
| 8161 | copynodelist(struct nodelist *lp) | 8191 | copynodelist(struct nodelist *lp) |
| 8162 | { | 8192 | { |
| @@ -8168,6 +8198,7 @@ copynodelist(struct nodelist *lp) | |||
| 8168 | *lpp = funcblock; | 8198 | *lpp = funcblock; |
| 8169 | funcblock = (char *) funcblock + SHELL_ALIGN(sizeof(struct nodelist)); | 8199 | funcblock = (char *) funcblock + SHELL_ALIGN(sizeof(struct nodelist)); |
| 8170 | (*lpp)->n = copynode(lp->n); | 8200 | (*lpp)->n = copynode(lp->n); |
| 8201 | SAVE_PTR2((*lpp)->n, (*lpp)->next); | ||
| 8171 | lp = lp->next; | 8202 | lp = lp->next; |
| 8172 | lpp = &(*lpp)->next; | 8203 | lpp = &(*lpp)->next; |
| 8173 | } | 8204 | } |
| @@ -8190,16 +8221,19 @@ copynode(union node *n) | |||
| 8190 | new->ncmd.redirect = copynode(n->ncmd.redirect); | 8221 | new->ncmd.redirect = copynode(n->ncmd.redirect); |
| 8191 | new->ncmd.args = copynode(n->ncmd.args); | 8222 | new->ncmd.args = copynode(n->ncmd.args); |
| 8192 | new->ncmd.assign = copynode(n->ncmd.assign); | 8223 | new->ncmd.assign = copynode(n->ncmd.assign); |
| 8224 | SAVE_PTR3(new->ncmd.redirect,new->ncmd.args, new->ncmd.assign); | ||
| 8193 | break; | 8225 | break; |
| 8194 | case NPIPE: | 8226 | case NPIPE: |
| 8195 | new->npipe.cmdlist = copynodelist(n->npipe.cmdlist); | 8227 | new->npipe.cmdlist = copynodelist(n->npipe.cmdlist); |
| 8196 | new->npipe.pipe_backgnd = n->npipe.pipe_backgnd; | 8228 | new->npipe.pipe_backgnd = n->npipe.pipe_backgnd; |
| 8229 | SAVE_PTR(new->npipe.cmdlist); | ||
| 8197 | break; | 8230 | break; |
| 8198 | case NREDIR: | 8231 | case NREDIR: |
| 8199 | case NBACKGND: | 8232 | case NBACKGND: |
| 8200 | case NSUBSHELL: | 8233 | case NSUBSHELL: |
| 8201 | new->nredir.redirect = copynode(n->nredir.redirect); | 8234 | new->nredir.redirect = copynode(n->nredir.redirect); |
| 8202 | new->nredir.n = copynode(n->nredir.n); | 8235 | new->nredir.n = copynode(n->nredir.n); |
| 8236 | SAVE_PTR2(new->nredir.redirect,new->nredir.n); | ||
| 8203 | break; | 8237 | break; |
| 8204 | case NAND: | 8238 | case NAND: |
| 8205 | case NOR: | 8239 | case NOR: |
| @@ -8208,31 +8242,37 @@ copynode(union node *n) | |||
| 8208 | case NUNTIL: | 8242 | case NUNTIL: |
| 8209 | new->nbinary.ch2 = copynode(n->nbinary.ch2); | 8243 | new->nbinary.ch2 = copynode(n->nbinary.ch2); |
| 8210 | new->nbinary.ch1 = copynode(n->nbinary.ch1); | 8244 | new->nbinary.ch1 = copynode(n->nbinary.ch1); |
| 8245 | SAVE_PTR2(new->nbinary.ch1,new->nbinary.ch2); | ||
| 8211 | break; | 8246 | break; |
| 8212 | case NIF: | 8247 | case NIF: |
| 8213 | new->nif.elsepart = copynode(n->nif.elsepart); | 8248 | new->nif.elsepart = copynode(n->nif.elsepart); |
| 8214 | new->nif.ifpart = copynode(n->nif.ifpart); | 8249 | new->nif.ifpart = copynode(n->nif.ifpart); |
| 8215 | new->nif.test = copynode(n->nif.test); | 8250 | new->nif.test = copynode(n->nif.test); |
| 8251 | SAVE_PTR3(new->nif.elsepart,new->nif.ifpart,new->nif.test); | ||
| 8216 | break; | 8252 | break; |
| 8217 | case NFOR: | 8253 | case NFOR: |
| 8218 | new->nfor.var = nodeckstrdup(n->nfor.var); | 8254 | new->nfor.var = nodeckstrdup(n->nfor.var); |
| 8219 | new->nfor.body = copynode(n->nfor.body); | 8255 | new->nfor.body = copynode(n->nfor.body); |
| 8220 | new->nfor.args = copynode(n->nfor.args); | 8256 | new->nfor.args = copynode(n->nfor.args); |
| 8257 | SAVE_PTR3(new->nfor.var,new->nfor.body,new->nfor.args); | ||
| 8221 | break; | 8258 | break; |
| 8222 | case NCASE: | 8259 | case NCASE: |
| 8223 | new->ncase.cases = copynode(n->ncase.cases); | 8260 | new->ncase.cases = copynode(n->ncase.cases); |
| 8224 | new->ncase.expr = copynode(n->ncase.expr); | 8261 | new->ncase.expr = copynode(n->ncase.expr); |
| 8262 | SAVE_PTR2(new->ncase.cases,new->ncase.expr); | ||
| 8225 | break; | 8263 | break; |
| 8226 | case NCLIST: | 8264 | case NCLIST: |
| 8227 | new->nclist.body = copynode(n->nclist.body); | 8265 | new->nclist.body = copynode(n->nclist.body); |
| 8228 | new->nclist.pattern = copynode(n->nclist.pattern); | 8266 | new->nclist.pattern = copynode(n->nclist.pattern); |
| 8229 | new->nclist.next = copynode(n->nclist.next); | 8267 | new->nclist.next = copynode(n->nclist.next); |
| 8268 | SAVE_PTR3(new->nclist.body,new->nclist.pattern,new->nclist.next); | ||
| 8230 | break; | 8269 | break; |
| 8231 | case NDEFUN: | 8270 | case NDEFUN: |
| 8232 | case NARG: | 8271 | case NARG: |
| 8233 | new->narg.backquote = copynodelist(n->narg.backquote); | 8272 | new->narg.backquote = copynodelist(n->narg.backquote); |
| 8234 | new->narg.text = nodeckstrdup(n->narg.text); | 8273 | new->narg.text = nodeckstrdup(n->narg.text); |
| 8235 | new->narg.next = copynode(n->narg.next); | 8274 | new->narg.next = copynode(n->narg.next); |
| 8275 | SAVE_PTR3(new->narg.backquote,new->narg.text,new->narg.next); | ||
| 8236 | break; | 8276 | break; |
| 8237 | case NTO: | 8277 | case NTO: |
| 8238 | #if ENABLE_ASH_BASH_COMPAT | 8278 | #if ENABLE_ASH_BASH_COMPAT |
| @@ -8245,6 +8285,7 @@ copynode(union node *n) | |||
| 8245 | new->nfile.fname = copynode(n->nfile.fname); | 8285 | new->nfile.fname = copynode(n->nfile.fname); |
| 8246 | new->nfile.fd = n->nfile.fd; | 8286 | new->nfile.fd = n->nfile.fd; |
| 8247 | new->nfile.next = copynode(n->nfile.next); | 8287 | new->nfile.next = copynode(n->nfile.next); |
| 8288 | SAVE_PTR2(new->nfile.fname,new->nfile.next); | ||
| 8248 | break; | 8289 | break; |
| 8249 | case NTOFD: | 8290 | case NTOFD: |
| 8250 | case NFROMFD: | 8291 | case NFROMFD: |
| @@ -8252,15 +8293,18 @@ copynode(union node *n) | |||
| 8252 | new->ndup.dupfd = n->ndup.dupfd; | 8293 | new->ndup.dupfd = n->ndup.dupfd; |
| 8253 | new->ndup.fd = n->ndup.fd; | 8294 | new->ndup.fd = n->ndup.fd; |
| 8254 | new->ndup.next = copynode(n->ndup.next); | 8295 | new->ndup.next = copynode(n->ndup.next); |
| 8296 | SAVE_PTR2(new->ndup.vname,new->ndup.next); | ||
| 8255 | break; | 8297 | break; |
| 8256 | case NHERE: | 8298 | case NHERE: |
| 8257 | case NXHERE: | 8299 | case NXHERE: |
| 8258 | new->nhere.doc = copynode(n->nhere.doc); | 8300 | new->nhere.doc = copynode(n->nhere.doc); |
| 8259 | new->nhere.fd = n->nhere.fd; | 8301 | new->nhere.fd = n->nhere.fd; |
| 8260 | new->nhere.next = copynode(n->nhere.next); | 8302 | new->nhere.next = copynode(n->nhere.next); |
| 8303 | SAVE_PTR2(new->nhere.doc,new->nhere.next); | ||
| 8261 | break; | 8304 | break; |
| 8262 | case NNOT: | 8305 | case NNOT: |
| 8263 | new->nnot.com = copynode(n->nnot.com); | 8306 | new->nnot.com = copynode(n->nnot.com); |
| 8307 | SAVE_PTR(new->nnot.com); | ||
| 8264 | break; | 8308 | break; |
| 8265 | }; | 8309 | }; |
| 8266 | new->type = n->type; | 8310 | new->type = n->type; |
| @@ -8283,6 +8327,7 @@ copyfunc(union node *n) | |||
| 8283 | f = ckmalloc(blocksize + funcstringsize); | 8327 | f = ckmalloc(blocksize + funcstringsize); |
| 8284 | funcblock = (char *) f + offsetof(struct funcnode, n); | 8328 | funcblock = (char *) f + offsetof(struct funcnode, n); |
| 8285 | funcstring = (char *) f + blocksize; | 8329 | funcstring = (char *) f + blocksize; |
| 8330 | IF_PLATFORM_MINGW32(nodeptr = NULL); | ||
| 8286 | copynode(n); | 8331 | copynode(n); |
| 8287 | f->count = 0; | 8332 | f->count = 0; |
| 8288 | return f; | 8333 | return f; |
