From 2ab4c0d9b8b15e770ef6a6af4f60a2f5bf007c2b Mon Sep 17 00:00:00 2001 From: Homer Hsing Date: Thu, 20 Sep 2012 14:04:20 +0800 Subject: [PATCH] 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. --- assembler/src/gram.y | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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