ref: d62c43899fd25fdc4883a32857d0f157aa2b6324
parent: 577a67cc1f129e3ab240fcc47bf6f31cf6996b8e
author: Miguel Pineiro Jr <mpj@pineiro.cc>
date: Mon Aug 29 11:13:39 EDT 2022
Stop node leaks subsequent to strnode
In every instance, after strnode has extracted the string, the node is leaked.
Tests:
valgrind --leak-check=full ./a.out '{sub("b", x)}' </dev/null
valgrind --leak-check=full ./a.out '{sub("b", r, s)}' </dev/null
valgrind --leak-check=full ./a.out '{match(s, "restr")}' </dev/null
valgrind --leak-check=full ./a.out '"s1" ~ "s2"' </dev/null
--- a/awkgram.y
+++ b/awkgram.y
@@ -206,9 +206,10 @@
{ $$ = op2(AND, notnull($1), notnull($3)); } | ppattern MATCHOP reg_expr { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); }| ppattern MATCHOP ppattern
- { if (constnode($3))+ { if (constnode($3)) {$$ = op3($2, NIL, $1, (Node*)makedfa(strnode($3), 0));
- else
+ free($3);
+ } else
$$ = op3($2, (Node *)1, $1, $3); }
| ppattern IN varname { $$ = op2(INTEST, $1, makearr($3)); } | '(' plist ')' IN varname { $$ = op2(INTEST, $2, makearr($5)); }@@ -233,9 +234,10 @@
| pattern NE pattern { $$ = op2($2, $1, $3); } | pattern MATCHOP reg_expr { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); }| pattern MATCHOP pattern
- { if (constnode($3))+ { if (constnode($3)) {$$ = op3($2, NIL, $1, (Node*)makedfa(strnode($3), 0));
- else
+ free($3);
+ } else
$$ = op3($2, (Node *)1, $1, $3); }
| pattern IN varname { $$ = op2(INTEST, $1, makearr($3)); } | '(' plist ')' IN varname { $$ = op2(INTEST, $2, makearr($5)); }@@ -388,9 +390,10 @@
| MATCHFCN '(' pattern comma reg_expr ')' { $$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa($5, 1)); } | MATCHFCN '(' pattern comma pattern ')'- { if (constnode($5))+ { if (constnode($5)) {$$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa(strnode($5), 1));
- else
+ free($5);
+ } else
$$ = op3(MATCHFCN, (Node *)1, $3, $5); }
| NUMBER { $$ = celltonode($1, CCON); } | SPLIT '(' pattern comma varname comma pattern ')' /* string */@@ -404,16 +407,18 @@
| subop '(' reg_expr comma pattern ')' { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, rectonode()); } | subop '(' pattern comma pattern ')'- { if (constnode($3))+ { if (constnode($3)) {$$ = op4($1, NIL, (Node*)makedfa(strnode($3), 1), $5, rectonode());
- else
+ free($3);
+ } else
$$ = op4($1, (Node *)1, $3, $5, rectonode()); }
| subop '(' reg_expr comma pattern comma var ')' { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, $7); } | subop '(' pattern comma pattern comma var ')'- { if (constnode($3))+ { if (constnode($3)) {$$ = op4($1, NIL, (Node*)makedfa(strnode($3), 1), $5, $7);
- else
+ free($3);
+ } else
$$ = op4($1, (Node *)1, $3, $5, $7); }
| SUBSTR '(' pattern comma pattern comma pattern ')' { $$ = op3(SUBSTR, $3, $5, $7); }--
⑨