summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHomer Hsing <homer.xing@intel.com>2012-09-20 14:04:20 +0800
committerDamien Lespiau <damien.lespiau@intel.com>2013-03-04 15:54:33 +0000
commit2ab4c0d9b8b15e770ef6a6af4f60a2f5bf007c2b (patch)
treee56ae3dc47cc3f9b1e130532febae5433a27382c
parent741008e0503df0a0626d27da99a30aac0c880c29 (diff)
Fix memory leaking in the parser
STRING has been malloc'ed by strdup in src/lex.l but forgotten to be freed in src/gram.y.
-rw-r--r--assembler/src/gram.y6
1 files changed, 5 insertions, 1 deletions
diff --git a/assembler/src/gram.y b/assembler/src/gram.y
index 645e5d46..01a3c0b9 100644
--- a/assembler/src/gram.y
+++ b/assembler/src/gram.y
@@ -257,10 +257,11 @@ declare_pragma: DECLARE_PRAGMA STRING declare_base declare_elementsize declare_s
defined = (reg = find_register($2)) != NULL;
if (defined) {
fprintf(stderr, "WARNING: %s already defined\n", $2);
+ free($2); // $2 has been malloc'ed by strdup
} else {
reg = calloc(sizeof(struct declared_register), 1);
+ reg->name = $2;
}
- reg->name = $2;
reg->base.reg_file = $3.reg_file;
reg->base.reg_nr = $3.reg_nr;
reg->base.subreg_nr = $3.subreg_nr;
@@ -1504,6 +1505,7 @@ symbol_reg: STRING %prec STR_SYMBOL_REG
}
memcpy(&$$, dcl_reg, sizeof(*dcl_reg));
+ free($1); // $1 has been malloc'ed by strdup
}
| symbol_reg_p
{
@@ -1522,6 +1524,7 @@ symbol_reg_p: STRING LPAREN exp RPAREN
memcpy(&$$, dcl_reg, sizeof(*dcl_reg));
$$.base.reg_nr += $3;
+ free($1);
}
| STRING LPAREN exp COMMA exp RPAREN
{
@@ -1537,6 +1540,7 @@ symbol_reg_p: STRING LPAREN exp RPAREN
$$.base.subreg_nr += $5;
$$.base.reg_nr += $$.base.subreg_nr / (32 / get_type_size(dcl_reg->type));
$$.base.subreg_nr = $$.base.subreg_nr % (32 / get_type_size(dcl_reg->type));
+ free($1);
}
;
/* Returns a partially complete destination register consisting of the