Module Name: src Committed By: rillig Date: Sat Oct 30 13:30:26 UTC 2021
Modified Files: src/tests/usr.bin/indent: t_errors.sh src/usr.bin/indent: indent.c Log Message: indent: fix assertion failure in search_stmt_comment I have no idea why the code was written in such a convoluted way before. By removing all the code that didn't make sense, everything just works as expected, and the existing tests all pass, especially those in token_comment.c that mention search_stmt_comment. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/tests/usr.bin/indent/t_errors.sh cvs rdiff -u -r1.186 -r1.187 src/usr.bin/indent/indent.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/indent/t_errors.sh diff -u src/tests/usr.bin/indent/t_errors.sh:1.13 src/tests/usr.bin/indent/t_errors.sh:1.14 --- src/tests/usr.bin/indent/t_errors.sh:1.13 Fri Oct 29 20:05:58 2021 +++ src/tests/usr.bin/indent/t_errors.sh Sat Oct 30 13:30:26 2021 @@ -1,5 +1,5 @@ #! /bin/sh -# $NetBSD: t_errors.sh,v 1.13 2021/10/29 20:05:58 rillig Exp $ +# $NetBSD: t_errors.sh,v 1.14 2021/10/30 13:30:26 rillig Exp $ # # Copyright (c) 2021 The NetBSD Foundation, Inc. # All rights reserved. @@ -411,9 +411,19 @@ unbalanced_parentheses_3_body() atf_test_case 'search_stmt_comment_segv' search_stmt_comment_segv_body() { + # Before NetBSD indent.c 1.187 from 2021-10-30, indent crashed while + # trying to format the following artificial code. + printf '{if(expr\n)/*c*/;}\n' > code.c - atf_check -s 'signal' -o 'ignore' -e 'match:assert' \ + cat <<\EOF > code.exp +{ + if (expr + ) /* c */ + ; +} +EOF + atf_check -o 'file:code.exp' \ "$indent" code.c -st } Index: src/usr.bin/indent/indent.c diff -u src/usr.bin/indent/indent.c:1.186 src/usr.bin/indent/indent.c:1.187 --- src/usr.bin/indent/indent.c:1.186 Sat Oct 30 11:37:38 2021 +++ src/usr.bin/indent/indent.c Sat Oct 30 13:30:26 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.c,v 1.186 2021/10/30 11:37:38 rillig Exp $ */ +/* $NetBSD: indent.c,v 1.187 2021/10/30 13:30:26 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -43,7 +43,7 @@ static char sccsid[] = "@(#)indent.c 5.1 #include <sys/cdefs.h> #if defined(__NetBSD__) -__RCSID("$NetBSD: indent.c,v 1.186 2021/10/30 11:37:38 rillig Exp $"); +__RCSID("$NetBSD: indent.c,v 1.187 2021/10/30 13:30:26 rillig Exp $"); #elif defined(__FreeBSD__) __FBSDID("$FreeBSD: head/usr.bin/indent/indent.c 340138 2018-11-04 19:24:49Z oshogbo $"); #endif @@ -189,17 +189,10 @@ search_stmt_comment(bool *comment_buffer * process_comment() will use that to calculate original indentation * of a boxed comment. */ - /* - * FIXME: This '4' needs an explanation. For example, in the snippet - * 'if(expr)/''*comment', the 'r)' of the code is not copied. If there - * is an additional line break before the ')', memcpy tries to copy - * (size_t)-1 bytes. - */ - assert((size_t)(inp.s - inp.buf) >= 4); - memcpy(sc_buf, inp.buf, (size_t)(inp.s - inp.buf) - 4); - save_com = sc_buf + (inp.s - inp.buf - 4); - save_com[0] = save_com[1] = ' '; - sc_end = &save_com[2]; + size_t line_len = (size_t)(inp.s - inp.buf) - strlen("/*"); + memcpy(sc_buf, inp.buf, line_len); + save_com = sc_buf + line_len; + sc_end = save_com; } *comment_buffered = true;