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