ash: fix miscalculation of memory needed for eval tree

found by Timo Teras (timo.teras AT iki.fi)
This commit is contained in:
Denis Vlasenko 2008-11-21 10:36:36 +00:00
parent b8baf407aa
commit 340299a8bc

View File

@ -536,6 +536,7 @@ static const char dolatstr[] ALIGN1 = {
#define NHERE 24
#define NXHERE 25
#define NNOT 26
#define N_NUMBER 27
union node;
@ -7546,43 +7547,44 @@ commandcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
/* ============ eval.c */
static int funcblocksize; /* size of structures in function */
static int funcstringsize; /* size of strings in node */
static void *funcblock; /* block to allocate function from */
static char *funcstring; /* block to allocate strings from */
static int funcblocksize; /* size of structures in function */
static int funcstringsize; /* size of strings in node */
static void *funcblock; /* block to allocate function from */
static char *funcstring; /* block to allocate strings from */
/* flags in argument to evaltree */
#define EV_EXIT 01 /* exit after evaluating tree */
#define EV_TESTED 02 /* exit status is checked; ignore -e flag */
#define EV_EXIT 01 /* exit after evaluating tree */
#define EV_TESTED 02 /* exit status is checked; ignore -e flag */
#define EV_BACKCMD 04 /* command executing within back quotes */
static const short nodesize[26] = {
SHELL_ALIGN(sizeof(struct ncmd)),
SHELL_ALIGN(sizeof(struct npipe)),
SHELL_ALIGN(sizeof(struct nredir)),
SHELL_ALIGN(sizeof(struct nredir)),
SHELL_ALIGN(sizeof(struct nredir)),
SHELL_ALIGN(sizeof(struct nbinary)),
SHELL_ALIGN(sizeof(struct nbinary)),
SHELL_ALIGN(sizeof(struct nbinary)),
SHELL_ALIGN(sizeof(struct nif)),
SHELL_ALIGN(sizeof(struct nbinary)),
SHELL_ALIGN(sizeof(struct nbinary)),
SHELL_ALIGN(sizeof(struct nfor)),
SHELL_ALIGN(sizeof(struct ncase)),
SHELL_ALIGN(sizeof(struct nclist)),
SHELL_ALIGN(sizeof(struct narg)),
SHELL_ALIGN(sizeof(struct narg)),
SHELL_ALIGN(sizeof(struct nfile)),
SHELL_ALIGN(sizeof(struct nfile)),
SHELL_ALIGN(sizeof(struct nfile)),
SHELL_ALIGN(sizeof(struct nfile)),
SHELL_ALIGN(sizeof(struct nfile)),
SHELL_ALIGN(sizeof(struct ndup)),
SHELL_ALIGN(sizeof(struct ndup)),
SHELL_ALIGN(sizeof(struct nhere)),
SHELL_ALIGN(sizeof(struct nhere)),
SHELL_ALIGN(sizeof(struct nnot)),
static const short nodesize[N_NUMBER] = {
[NCMD ] = SHELL_ALIGN(sizeof(struct ncmd)),
[NPIPE ] = SHELL_ALIGN(sizeof(struct npipe)),
[NREDIR ] = SHELL_ALIGN(sizeof(struct nredir)),
[NBACKGND ] = SHELL_ALIGN(sizeof(struct nredir)),
[NSUBSHELL] = SHELL_ALIGN(sizeof(struct nredir)),
[NAND ] = SHELL_ALIGN(sizeof(struct nbinary)),
[NOR ] = SHELL_ALIGN(sizeof(struct nbinary)),
[NSEMI ] = SHELL_ALIGN(sizeof(struct nbinary)),
[NIF ] = SHELL_ALIGN(sizeof(struct nif)),
[NWHILE ] = SHELL_ALIGN(sizeof(struct nbinary)),
[NUNTIL ] = SHELL_ALIGN(sizeof(struct nbinary)),
[NFOR ] = SHELL_ALIGN(sizeof(struct nfor)),
[NCASE ] = SHELL_ALIGN(sizeof(struct ncase)),
[NCLIST ] = SHELL_ALIGN(sizeof(struct nclist)),
[NDEFUN ] = SHELL_ALIGN(sizeof(struct narg)),
[NARG ] = SHELL_ALIGN(sizeof(struct narg)),
[NTO ] = SHELL_ALIGN(sizeof(struct nfile)),
[NTO2 ] = SHELL_ALIGN(sizeof(struct nfile)),
[NCLOBBER ] = SHELL_ALIGN(sizeof(struct nfile)),
[NFROM ] = SHELL_ALIGN(sizeof(struct nfile)),
[NFROMTO ] = SHELL_ALIGN(sizeof(struct nfile)),
[NAPPEND ] = SHELL_ALIGN(sizeof(struct nfile)),
[NTOFD ] = SHELL_ALIGN(sizeof(struct ndup)),
[NFROMFD ] = SHELL_ALIGN(sizeof(struct ndup)),
[NHERE ] = SHELL_ALIGN(sizeof(struct nhere)),
[NXHERE ] = SHELL_ALIGN(sizeof(struct nhere)),
[NNOT ] = SHELL_ALIGN(sizeof(struct nnot)),
};
static void calcsize(union node *n);