summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrillig <rillig@NetBSD.org>2022-04-03 00:39:32 +0000
committerrillig <rillig@NetBSD.org>2022-04-03 00:39:32 +0000
commit4e684ee09e491c896e67eccf6b43bd39c76a22af (patch)
tree91252dc2b5dbb139f8d7831b5236780dda2a0dae
parent62c949d085b04303064086049ca087fca376b3e3 (diff)
lint: fix crash after syntax error in GCC statement expression
Since cgram.y 1.226 from 2021-05-03.
-rw-r--r--tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c15
-rw-r--r--tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp1
-rw-r--r--usr.bin/xlint/lint1/tree.c11
3 files changed, 22 insertions, 5 deletions
diff --git a/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c b/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c
index 0bfad6835f9..cea5f357c84 100644
--- a/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c
+++ b/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c
@@ -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] */
+ ;
+ });
+}
diff --git a/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp b/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp
index a0fa61e6fd3..09d1c93a3b7 100644
--- a/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp
+++ b/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp
@@ -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]
diff --git a/usr.bin/xlint/lint1/tree.c b/usr.bin/xlint/lint1/tree.c
index d0da5679a22..b867d6ece2b 100644
--- a/usr.bin/xlint/lint1/tree.c
+++ b/usr.bin/xlint/lint1/tree.c
@@ -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);