From f9791684fdba8d76d112c9cc4846c605d0562cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Mon, 8 Dec 2014 10:53:03 +0100 Subject: [PATCH] Compiler: Fixed NULL-deref in tree optimizer. CAR for a F_*_EQ node may be NULL if the variable hasn't been declared. Fixes [bug 7397]. --- src/las.c | 2 +- src/treeopt.in | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/las.c b/src/las.c index 3cd8b1d867..c17889f13f 100644 --- a/src/las.c +++ b/src/las.c @@ -2962,7 +2962,7 @@ static int depend_p2(node *a, node *b) static int depend_p3(node *a,node *b) { - if(!b) return 0; + if(!b || !a) return 0; #if 0 if(!(b->tree_info & OPT_SIDE_EFFECT) && (b->tree_info & OPT_EXTERNAL_DEPEND)) diff --git a/src/treeopt.in b/src/treeopt.in index 4115308a46..26c6c5fe69 100644 --- a/src/treeopt.in +++ b/src/treeopt.in @@ -1634,7 +1634,7 @@ F_LOOP(0 = +[ !depend_p($$, $$)] // also change the code for F_ASSIGN_SELF in docode.c. // // It _knows_ what the nodes look like. -F_ADD_EQ(0,1) : +F_ADD_EQ(0 = +, 1) : { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || @@ -1642,7 +1642,7 @@ F_ADD_EQ(0,1) : $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`+", $0, $1 )), $0 ); }; -F_SUB_EQ(0,1) : +F_SUB_EQ(0 = +, 1) : { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || @@ -1650,7 +1650,7 @@ F_SUB_EQ(0,1) : $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`-", $0, $1 )), $0 ); }; -F_AND_EQ(0,1) : +F_AND_EQ(0 = +, 1) : { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || @@ -1658,7 +1658,7 @@ F_AND_EQ(0,1) : $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`&", $0, $1 )), $0 ); }; -F_OR_EQ(0,1) : +F_OR_EQ(0 = +, 1) : { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || @@ -1666,7 +1666,7 @@ F_OR_EQ(0,1) : $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`|", $0, $1 )), $0 ); }; -F_XOR_EQ(0,1) : +F_XOR_EQ(0 = +, 1) : { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || @@ -1674,14 +1674,14 @@ F_XOR_EQ(0,1) : $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`^", $0, $1 )), $0 ); }; -F_LSH_EQ(0,1) : +F_LSH_EQ(0 = +, 1) : { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || depend_p($0, $1)) ? F_ASSIGN_SELF : F_ASSIGN; $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`<<", $0, $1)), $0 ); }; -F_RSH_EQ(0,1) : +F_RSH_EQ(0 = +, 1) : { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || @@ -1689,7 +1689,7 @@ F_RSH_EQ(0,1) : $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`>>", $0, $1)), $0 ); }; -F_MULT_EQ(0,1): +F_MULT_EQ(0 = +, 1): { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || @@ -1697,7 +1697,7 @@ F_MULT_EQ(0,1): $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`*", $0, $1 )), $0 ); }; -F_MOD_EQ(0,1) : +F_MOD_EQ(0 = +, 1) : { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || @@ -1705,7 +1705,7 @@ F_MOD_EQ(0,1) : $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`%", $0, $1 )), $0 ); }; -F_DIV_EQ(0,1) : +F_DIV_EQ(0 = +, 1) : { struct pike_type *type = $0->type; int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) || -- GitLab