Module Name:    src
Committed By:   rillig
Date:           Sun Apr  3 00:39:32 UTC 2022

Modified Files:
        src/tests/usr.bin/xlint/lint1: d_gcc_compound_statements1.c
            d_gcc_compound_statements1.exp
        src/usr.bin/xlint/lint1: tree.c

Log Message:
lint: fix crash after syntax error in GCC statement expression

Since cgram.y 1.226 from 2021-05-03.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 \
    src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c
cvs rdiff -u -r1.3 -r1.4 \
    src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp
cvs rdiff -u -r1.417 -r1.418 src/usr.bin/xlint/lint1/tree.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c
diff -u src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c:1.7 src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c:1.8
--- src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c:1.7	Sat Jan 15 14:22:03 2022
+++ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c	Sun Apr  3 00:39:32 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: d_gcc_compound_statements1.c,v 1.7 2022/01/15 14:22:03 rillig Exp $	*/
+/*	$NetBSD: d_gcc_compound_statements1.c,v 1.8 2022/04/03 00:39:32 rillig Exp $	*/
 # 3 "d_gcc_compound_statements1.c"
 
 /* GCC compound statement with expression */
@@ -37,3 +37,16 @@ function(void)
 		0->e;
 	});
 }
+
+void
+crash(void)
+{
+	/*
+	 * Before tree.c 1.418 from 2022-04-03, lint dereferenced a null
+	 * pointer in do_statement_expr.
+	 */
+	({
+		/* expect+1: error: syntax error ';' [249] */
+		;
+	});
+}

Index: src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp
diff -u src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp:1.3 src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp:1.4
--- src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp:1.3	Sat Jan 15 14:22:03 2022
+++ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp	Sun Apr  3 00:39:32 2022
@@ -1,3 +1,4 @@
 d_gcc_compound_statements1.c(24): error: syntax error 'return outside function' [249]
 d_gcc_compound_statements1.c(25): error: cannot initialize 'int' from 'void' [185]
 d_gcc_compound_statements1.c(37): error: type 'int' does not have member 'e' [101]
+d_gcc_compound_statements1.c(50): error: syntax error ';' [249]

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.417 src/usr.bin/xlint/lint1/tree.c:1.418
--- src/usr.bin/xlint/lint1/tree.c:1.417	Sat Apr  2 22:38:45 2022
+++ src/usr.bin/xlint/lint1/tree.c	Sun Apr  3 00:39:32 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.417 2022/04/02 22:38:45 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.418 2022/04/03 00:39:32 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.417 2022/04/02 22:38:45 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.418 2022/04/03 00:39:32 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -4546,18 +4546,21 @@ do_statement_expr(tnode_t *tn)
 {
 	block_level--;
 	mem_block_level--;
-	stmt_exprs->se_sym = mktempsym(block_dup_type(tn->tn_type));
+	stmt_exprs->se_sym = tn != NULL
+	    ? mktempsym(block_dup_type(tn->tn_type))
+	    : NULL;		/* after a syntax error */
 	mem_block_level++;
 	block_level++;
 	/* ({ }) is a GCC extension */
 	gnuism(320);
-
 }
 
 tnode_t *
 end_statement_expr(void)
 {
 	stmt_expr *se = stmt_exprs;
+	if (se->se_sym == NULL)
+		return NULL;	/* after a syntax error */
 	tnode_t *tn = build_name(se->se_sym, false);
 	(void)expr_save_memory();	/* leak */
 	expr_restore_memory(se->se_mem);

Reply via email to