Module Name: src Committed By: rillig Date: Sun Jun 20 11:24:32 UTC 2021
Modified Files: src/tests/usr.bin/xlint/lint1: decl_struct_member.c decl_struct_member.exp src/usr.bin/xlint/lint1: decl.c Log Message: lint: fix assertion failure on malformed struct declaration Found using afl. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/xlint/lint1/decl_struct_member.c \ src/tests/usr.bin/xlint/lint1/decl_struct_member.exp cvs rdiff -u -r1.187 -r1.188 src/usr.bin/xlint/lint1/decl.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/decl_struct_member.c diff -u src/tests/usr.bin/xlint/lint1/decl_struct_member.c:1.1 src/tests/usr.bin/xlint/lint1/decl_struct_member.c:1.2 --- src/tests/usr.bin/xlint/lint1/decl_struct_member.c:1.1 Sat Jun 19 19:49:15 2021 +++ src/tests/usr.bin/xlint/lint1/decl_struct_member.c Sun Jun 20 11:24:32 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: decl_struct_member.c,v 1.1 2021/06/19 19:49:15 rillig Exp $ */ +/* $NetBSD: decl_struct_member.c,v 1.2 2021/06/20 11:24:32 rillig Exp $ */ # 3 "decl_struct_member.c" /* @@ -10,3 +10,16 @@ struct { char; /* expect: syntax error 'unnamed member' */ }; + +/* + * Before decl.c 1.188 from 2021-06-20, lint ran into a segmentation fault. + */ +struct { + char a(_)0 /* expect: syntax error '0' */ +} /* expect: ';' after last */ +/* + * FIXME: adding a semicolon here triggers another assertion: + * + * assertion "t == NOTSPEC" failed in deftyp at decl.c:774 + */ +/* expect+1: cannot recover from previous errors */ Index: src/tests/usr.bin/xlint/lint1/decl_struct_member.exp diff -u src/tests/usr.bin/xlint/lint1/decl_struct_member.exp:1.1 src/tests/usr.bin/xlint/lint1/decl_struct_member.exp:1.2 --- src/tests/usr.bin/xlint/lint1/decl_struct_member.exp:1.1 Sat Jun 19 19:49:15 2021 +++ src/tests/usr.bin/xlint/lint1/decl_struct_member.exp Sun Jun 20 11:24:32 2021 @@ -1 +1,4 @@ decl_struct_member.c(11): error: syntax error 'unnamed member' [249] +decl_struct_member.c(18): error: syntax error '0' [249] +decl_struct_member.c(19): warning: syntax requires ';' after last struct/union member [66] +decl_struct_member.c(26): error: cannot recover from previous errors [224] Index: src/usr.bin/xlint/lint1/decl.c diff -u src/usr.bin/xlint/lint1/decl.c:1.187 src/usr.bin/xlint/lint1/decl.c:1.188 --- src/usr.bin/xlint/lint1/decl.c:1.187 Sun Jun 20 11:00:18 2021 +++ src/usr.bin/xlint/lint1/decl.c Sun Jun 20 11:24:32 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: decl.c,v 1.187 2021/06/20 11:00:18 rillig Exp $ */ +/* $NetBSD: decl.c,v 1.188 2021/06/20 11:24:32 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: decl.c,v 1.187 2021/06/20 11:00:18 rillig Exp $"); +__RCSID("$NetBSD: decl.c,v 1.188 2021/06/20 11:24:32 rillig Exp $"); #endif #include <sys/param.h> @@ -1806,6 +1806,9 @@ complete_tag_struct_or_union(type_t *tp, int n; sym_t *mem; + if (tp == NULL) /* in case of syntax errors */ + return gettyp(INT); + setcomplete(tp, true); t = tp->t_tspec;