ash: all blocks in function node copying must be SHELL_ALIGNed
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 7 Oct 2016 02:28:33 +0000 (04:28 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 7 Oct 2016 02:28:33 +0000 (04:28 +0200)
Previous commit probably introduced a bug:
non-matching size calculation in size counting and
actual copying caused by SHELL_ALIGN being applied differently!
This won't bite if string sizes are also SHELL_ALIGNed.
Thus fixing.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index 4ab2f2077cdd1108106cec5c7aded76436e19b73..50f479d1a9d2648eed63641e9d1e06540cb35b36 100644 (file)
@@ -8248,7 +8248,7 @@ calcsize(int funcblocksize, union node *n)
                funcblocksize = calcsize(funcblocksize, n->nif.test);
                break;
        case NFOR:
-               funcblocksize += strlen(n->nfor.var) + 1; /* was funcstringsize += ... */
+               funcblocksize += SHELL_ALIGN(strlen(n->nfor.var) + 1); /* was funcstringsize += ... */
                funcblocksize = calcsize(funcblocksize, n->nfor.body);
                funcblocksize = calcsize(funcblocksize, n->nfor.args);
                break;
@@ -8264,7 +8264,7 @@ calcsize(int funcblocksize, union node *n)
        case NDEFUN:
        case NARG:
                funcblocksize = sizenodelist(funcblocksize, n->narg.backquote);
-               funcblocksize += strlen(n->narg.text) + 1; /* was funcstringsize += ... */
+               funcblocksize += SHELL_ALIGN(strlen(n->narg.text) + 1); /* was funcstringsize += ... */
                funcblocksize = calcsize(funcblocksize, n->narg.next);
                break;
        case NTO:
@@ -8298,7 +8298,7 @@ calcsize(int funcblocksize, union node *n)
 static char *
 nodeckstrdup(char *s)
 {
-       funcstring_end -= strlen(s) + 1;
+       funcstring_end -= SHELL_ALIGN(strlen(s) + 1);
        return strcpy(funcstring_end, s);
 }