From d86ad7f7aac25ae74d58b3a18a885bcd4be43b97 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Tue, 9 Dec 2014 18:20:11 +0100
Subject: [PATCH] Compiler: Fixed some NULL-dereferences.

expr4 nonterminals can be NULL for eg undeclared variables.

Thanks to Jakub Krajewski <jkrajewski@opera.com> for the report.

Fixes [Pike mailinglist 14323].
---
 src/language.yacc | 10 +++++-----
 src/las.c         |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/language.yacc b/src/language.yacc
index 168d758823..c33df314e5 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -3589,14 +3589,14 @@ expr4: string
   | expr4 TOK_SAFE_START_INDEX line_number_info expr0 ']'
   {
     /* A[?X] to ((tmp=A) && tmp[X]) */
-    if( $1->token == F_LOCAL )
+    if( $1 && ($1->token == F_LOCAL) )
     {
       $$=mknode(F_LAND, copy_node($1), mknode(F_INDEX,  $1, $4));
     }
     else
     {
       fix_type_field( $1 );
-      if( $1->type )
+      if( $1 && $1->type )
       {
         int temporary;
         $1->type->refs++;
@@ -3621,14 +3621,14 @@ expr4: string
   {
     /* A[?X..Y] to ((tmp=A) && tmp[X..Y]) */
     node *range = mknode(':',$4,$6);
-    if( $1->token == F_LOCAL )
+    if( $1 && ($1->token == F_LOCAL ) )
     {
       $$ = mknode( F_LAND, copy_node($1), mknode(F_RANGE, $1, range) );
     }
     else
     {
       fix_type_field( $1 );
-      if( $1->type )
+      if( $1 && $1->type )
       {
         int temporary;
         $1->type->refs++;
@@ -3735,7 +3735,7 @@ expr4: string
   {
     /* A?->B to ((tmp=A) && tmp->B) */
     int temporary;
-    if( $1->token == F_LOCAL )
+    if( $1 && ($1->token == F_LOCAL) )
     {
       $$=mknode(F_LAND, copy_node($1), mknode(F_ARROW, $1, $4));
     }
diff --git a/src/las.c b/src/las.c
index c17889f13f..ea284d53d5 100644
--- a/src/las.c
+++ b/src/las.c
@@ -3167,7 +3167,7 @@ void fix_type_field(node *n)
   struct pike_type *type_a, *type_b;
   struct pike_type *old_type;
 
-  if (n->type && !(n->node_info & OPT_TYPE_NOT_FIXED))
+  if (!n || (n->type && !(n->node_info & OPT_TYPE_NOT_FIXED)))
     return; /* assume it is correct */
 
   old_type = n->type;
-- 
GitLab