aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-02-24 17:05:52 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-02-24 17:05:52 +0000
commit629563b5d7baee9a2008cd102924be6d55321bb7 (patch)
treecda7b6703ac5561224d46515bec491148e335c09
parent5276402f2cdf39f8963243d7f54bf7f8c32ffd29 (diff)
downloadbusybox-w32-629563b5d7baee9a2008cd102924be6d55321bb7.tar.gz
busybox-w32-629563b5d7baee9a2008cd102924be6d55321bb7.tar.bz2
busybox-w32-629563b5d7baee9a2008cd102924be6d55321bb7.zip
awk: fix memory leak (can affect large file processing)
-rw-r--r--editors/awk.c36
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 @@
12#include <math.h> 12#include <math.h>
13 13
14 14
15#define MAXVARFMT 240 15#define MAXVARFMT 240
16#define MINNVBLOCK 64 16#define MINNVBLOCK 64
17 17
18/* variable flags */ 18/* variable flags */
19#define VF_NUMBER 0x0001 /* 1 = primary type is number */ 19#define VF_NUMBER 0x0001 /* 1 = primary type is number */
20#define VF_ARRAY 0x0002 /* 1 = it's an array */ 20#define VF_ARRAY 0x0002 /* 1 = it's an array */
21 21
22#define VF_CACHED 0x0100 /* 1 = num/str value has cached str/num eq */ 22#define VF_CACHED 0x0100 /* 1 = num/str value has cached str/num eq */
23#define VF_USER 0x0200 /* 1 = user input (may be numeric string) */ 23#define VF_USER 0x0200 /* 1 = user input (may be numeric string) */
24#define VF_SPECIAL 0x0400 /* 1 = requires extra handling when changed */ 24#define VF_SPECIAL 0x0400 /* 1 = requires extra handling when changed */
25#define VF_WALK 0x0800 /* 1 = variable has alloc'd x.walker list */ 25#define VF_WALK 0x0800 /* 1 = variable has alloc'd x.walker list */
26#define VF_FSTR 0x1000 /* 1 = string points to fstring buffer */ 26#define VF_FSTR 0x1000 /* 1 = var::string points to fstring buffer */
27#define VF_CHILD 0x2000 /* 1 = function arg; x.parent points to source */ 27#define VF_CHILD 0x2000 /* 1 = function arg; x.parent points to source */
28#define VF_DIRTY 0x4000 /* 1 = variable was set explicitly */ 28#define VF_DIRTY 0x4000 /* 1 = variable was set explicitly */
29 29
30/* these flags are static, don't change them when value is changed */ 30/* these flags are static, don't change them when value is changed */
31#define VF_DONTTOUCH (VF_ARRAY | VF_SPECIAL | VF_WALK | VF_CHILD | VF_DIRTY) 31#define VF_DONTTOUCH (VF_ARRAY | VF_SPECIAL | VF_WALK | VF_CHILD | VF_DIRTY)
32 32
33/* Variable */ 33/* Variable */
34typedef struct var_s { 34typedef struct var_s {
35 unsigned short type; /* flags */ 35 unsigned short type; /* flags */
36 double number; 36 double number;
37 char *string; 37 char *string;
38 union { 38 union {
39 int aidx; /* func arg idx (for compilation stage) */ 39 int aidx; /* func arg idx (for compilation stage) */
40 struct xhash_s *array; /* array ptr */ 40 struct xhash_s *array; /* array ptr */
41 struct var_s *parent; /* for func args, ptr to actual parameter */ 41 struct var_s *parent; /* for func args, ptr to actual parameter */
42 char **walker; /* list of array elements (for..in) */ 42 char **walker; /* list of array elements (for..in) */
43 } x; 43 } x;
44} var; 44} var;
45 45
@@ -740,7 +740,7 @@ static var *copyvar(var *dest, const var *src)
740{ 740{
741 if (dest != src) { 741 if (dest != src) {
742 clrvar(dest); 742 clrvar(dest);
743 dest->type |= (src->type & ~VF_DONTTOUCH); 743 dest->type |= (src->type & ~(VF_DONTTOUCH | VF_FSTR));
744 dest->number = src->number; 744 dest->number = src->number;
745 if (src->string) 745 if (src->string)
746 dest->string = xstrdup(src->string); 746 dest->string = xstrdup(src->string);