diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-24 17:05:52 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-24 17:05:52 +0000 |
commit | 629563b5d7baee9a2008cd102924be6d55321bb7 (patch) | |
tree | cda7b6703ac5561224d46515bec491148e335c09 /editors | |
parent | 5276402f2cdf39f8963243d7f54bf7f8c32ffd29 (diff) | |
download | busybox-629563b5d7baee9a2008cd102924be6d55321bb7.tar.gz |
awk: fix memory leak (can affect large file processing)
Diffstat (limited to 'editors')
-rw-r--r-- | editors/awk.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/editors/awk.c b/editors/awk.c index 9af6ecc5b..d0b03c373 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -12,34 +12,34 @@ #include <math.h> -#define MAXVARFMT 240 -#define MINNVBLOCK 64 +#define MAXVARFMT 240 +#define MINNVBLOCK 64 /* variable flags */ -#define VF_NUMBER 0x0001 /* 1 = primary type is number */ -#define VF_ARRAY 0x0002 /* 1 = it's an array */ +#define VF_NUMBER 0x0001 /* 1 = primary type is number */ +#define VF_ARRAY 0x0002 /* 1 = it's an array */ -#define VF_CACHED 0x0100 /* 1 = num/str value has cached str/num eq */ -#define VF_USER 0x0200 /* 1 = user input (may be numeric string) */ -#define VF_SPECIAL 0x0400 /* 1 = requires extra handling when changed */ -#define VF_WALK 0x0800 /* 1 = variable has alloc'd x.walker list */ -#define VF_FSTR 0x1000 /* 1 = string points to fstring buffer */ -#define VF_CHILD 0x2000 /* 1 = function arg; x.parent points to source */ -#define VF_DIRTY 0x4000 /* 1 = variable was set explicitly */ +#define VF_CACHED 0x0100 /* 1 = num/str value has cached str/num eq */ +#define VF_USER 0x0200 /* 1 = user input (may be numeric string) */ +#define VF_SPECIAL 0x0400 /* 1 = requires extra handling when changed */ +#define VF_WALK 0x0800 /* 1 = variable has alloc'd x.walker list */ +#define VF_FSTR 0x1000 /* 1 = var::string points to fstring buffer */ +#define VF_CHILD 0x2000 /* 1 = function arg; x.parent points to source */ +#define VF_DIRTY 0x4000 /* 1 = variable was set explicitly */ /* these flags are static, don't change them when value is changed */ -#define VF_DONTTOUCH (VF_ARRAY | VF_SPECIAL | VF_WALK | VF_CHILD | VF_DIRTY) +#define VF_DONTTOUCH (VF_ARRAY | VF_SPECIAL | VF_WALK | VF_CHILD | VF_DIRTY) /* Variable */ typedef struct var_s { - unsigned short type; /* flags */ + unsigned short type; /* flags */ double number; char *string; union { - int aidx; /* func arg idx (for compilation stage) */ - struct xhash_s *array; /* array ptr */ - struct var_s *parent; /* for func args, ptr to actual parameter */ - char **walker; /* list of array elements (for..in) */ + int aidx; /* func arg idx (for compilation stage) */ + struct xhash_s *array; /* array ptr */ + struct var_s *parent; /* for func args, ptr to actual parameter */ + char **walker; /* list of array elements (for..in) */ } x; } var; @@ -740,7 +740,7 @@ static var *copyvar(var *dest, const var *src) { if (dest != src) { clrvar(dest); - dest->type |= (src->type & ~VF_DONTTOUCH); + dest->type |= (src->type & ~(VF_DONTTOUCH | VF_FSTR)); dest->number = src->number; if (src->string) dest->string = xstrdup(src->string); |