From efd3b6352aee0f6f8a19115c38da0260ab89e886 Mon Sep 17 00:00:00 2001 From: Arne Goedeke <el@laramies.com> Date: Mon, 28 Oct 2013 15:42:14 +0100 Subject: [PATCH] Compiler: Fix use-after-free When using an argument in several nodes, the refcount needs to be incremented accordingly. --- src/language.yacc | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/language.yacc b/src/language.yacc index 467df33fcd..b4c1a00949 100644 --- a/src/language.yacc +++ b/src/language.yacc @@ -3610,7 +3610,7 @@ expr4: string /* A?[X] to ((tmp=A) && tmp[X]) */ if( $1->token == F_LOCAL ) { - $$=mknode(F_LAND, $1, mknode(F_INDEX, $1, $4)); + $$=mknode(F_LAND, copy_node($1), mknode(F_INDEX, $1, $4)); } else { @@ -3642,7 +3642,7 @@ expr4: string node *range = mknode(':',$4,$6); if( $1->token == F_LOCAL ) { - $$ = mknode( F_LAND, $1, mknode(F_RANGE, $1, range) ); + $$ = mknode( F_LAND, copy_node($1), mknode(F_RANGE, $1, range) ); } else { @@ -3666,10 +3666,6 @@ expr4: string } COPY_LINE_NUMBER_INFO($$, $3); free_node ($3); - - - COPY_LINE_NUMBER_INFO($$, $3); - free_node ($3); } | expr4 open_bracket_with_line_info error ']' { @@ -3760,7 +3756,7 @@ expr4: string int temporary; if( $1->token == F_LOCAL ) { - $$=mknode(F_LAND, $1, mknode(F_ARROW, $1, $4)); + $$=mknode(F_LAND, copy_node($1), mknode(F_ARROW, $1, $4)); } else { -- GitLab