Module Name:    src
Committed By:   rillig
Date:           Tue Oct  5 06:55:24 UTC 2021

Modified Files:
        src/usr.bin/indent: indent.c parse.c

Log Message:
indent: fix Clang-Tidy warnings, clean up bakcopy

The comment above and inside bakcopy had been outdated for at least the
last 28 years, the backup file is named "%s.BAK", not ".B%s".

Prevent buffer overflow for very long filenames (sprintf -> snprintf).


To generate a diff of this commit:
cvs rdiff -u -r1.102 -r1.103 src/usr.bin/indent/indent.c
cvs rdiff -u -r1.28 -r1.29 src/usr.bin/indent/parse.c

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

Modified files:

Index: src/usr.bin/indent/indent.c
diff -u src/usr.bin/indent/indent.c:1.102 src/usr.bin/indent/indent.c:1.103
--- src/usr.bin/indent/indent.c:1.102	Tue Oct  5 06:49:19 2021
+++ src/usr.bin/indent/indent.c	Tue Oct  5 06:55:24 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.c,v 1.102 2021/10/05 06:49:19 rillig Exp $	*/
+/*	$NetBSD: indent.c,v 1.103 2021/10/05 06:55:24 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.102 2021/10/05 06:49:19 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.103 2021/10/05 06:55:24 rillig Exp $");
 #elif defined(__FreeBSD__)
 __FBSDID("$FreeBSD: head/usr.bin/indent/indent.c 340138 2018-11-04 19:24:49Z oshogbo $");
 #endif
@@ -607,7 +607,6 @@ want_blank_before_lparen(void)
 static void
 process_lparen_or_lbracket(int dec_ind, bool tabs_to_var, bool sp_sw)
 {
-    /* count parens to make Healy happy */
     if (++ps.p_l_follow == nitems(ps.paren_indents)) {
 	diag(0, "Reached internal limit of %zu unclosed parens",
 	    nitems(ps.paren_indents));
@@ -625,13 +624,13 @@ process_lparen_or_lbracket(int dec_ind, 
     *code.e++ = token.s[0];
 
     ps.paren_indents[ps.p_l_follow - 1] =
-	indentation_after_range(0, code.s, code.e);
+	(short)indentation_after_range(0, code.s, code.e);
     debug_println("paren_indent[%d] is now %d",
 	ps.p_l_follow - 1, ps.paren_indents[ps.p_l_follow - 1]);
 
     if (sp_sw && ps.p_l_follow == 1 && opt.extra_expression_indent
 	    && ps.paren_indents[0] < 2 * opt.indent_size) {
-	ps.paren_indents[0] = 2 * opt.indent_size;
+	ps.paren_indents[0] = (short)(2 * opt.indent_size);
 	debug_println("paren_indent[0] is now %d", ps.paren_indents[0]);
     }
     if (ps.in_or_st && *token.s == '(' && ps.tos <= 2) {
@@ -733,7 +732,7 @@ static void
 process_question(int *inout_squest)
 {
     (*inout_squest)++;		/* this will be used when a later colon
-				 * appears so we can distinguish the
+				 * appears, so we can distinguish the
 				 * <c>?<n>:<n> construct */
     if (ps.want_blank)
 	*code.e++ = ' ';
@@ -1425,37 +1424,31 @@ main(int argc, char **argv)
 }
 
 /*
- * copy input file to backup file if in_name is /blah/blah/blah/file, then
- * backup file will be ".Bfile" then make the backup file the input and
- * original input file the output
+ * Copy the input file to the backup file, then make the backup file the input
+ * and the original input file the output.
  */
 static void
 bakcopy(void)
 {
     ssize_t n;
-    int bakchn;
+    int bak_fd;
     char buff[8 * 1024];
-    const char *p;
 
-    /* construct file name .Bfile */
-    for (p = in_name; *p != '\0'; p++);	/* skip to end of string */
-    while (p > in_name && *p != '/')	/* find last '/' */
-	p--;
-    if (*p == '/')
-	p++;
-    sprintf(bakfile, "%s%s", p, backup_suffix);
+    const char *last_slash = strrchr(in_name, '/');
+    snprintf(bakfile, sizeof(bakfile), "%s%s",
+	last_slash != NULL ? last_slash + 1 : in_name, backup_suffix);
 
     /* copy in_name to backup file */
-    bakchn = creat(bakfile, 0600);
-    if (bakchn < 0)
+    bak_fd = creat(bakfile, 0600);
+    if (bak_fd < 0)
 	err(1, "%s", bakfile);
     while ((n = read(fileno(input), buff, sizeof(buff))) > 0)
-	if (write(bakchn, buff, (size_t)n) != n)
+	if (write(bak_fd, buff, (size_t)n) != n)
 	    err(1, "%s", bakfile);
     if (n < 0)
 	err(1, "%s", in_name);
-    close(bakchn);
-    fclose(input);
+    close(bak_fd);
+    (void)fclose(input);
 
     /* re-open backup file as the input file */
     input = fopen(bakfile, "r");
@@ -1492,7 +1485,7 @@ indent_declaration(int cur_dec_ind, bool
 	    pos = tpos;
 	}
     }
-    check_size_code((size_t)(cur_dec_ind - pos + 1));
+    check_size_code((size_t)(cur_dec_ind - pos) + 1);
     while (pos < cur_dec_ind) {
 	*code.e++ = ' ';
 	pos++;

Index: src/usr.bin/indent/parse.c
diff -u src/usr.bin/indent/parse.c:1.28 src/usr.bin/indent/parse.c:1.29
--- src/usr.bin/indent/parse.c:1.28	Tue Oct  5 06:24:06 2021
+++ src/usr.bin/indent/parse.c	Tue Oct  5 06:55:24 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.28 2021/10/05 06:24:06 rillig Exp $	*/
+/*	$NetBSD: parse.c,v 1.29 2021/10/05 06:55:24 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -189,10 +189,10 @@ parse(token_type ttype)
 	ps.cstk[ps.tos] = case_ind;
 	/* save current case indent level */
 	ps.il[ps.tos] = ps.ind_level_follow;
-	case_ind = ps.ind_level_follow + opt.case_indent; /* cases should be
-				 * one level deeper than the switch */
-	ps.ind_level_follow += opt.case_indent + 1; /* statements should be
-				 * two levels deeper */
+	/* cases should be one level deeper than the switch */
+	case_ind = (float)ps.ind_level_follow + opt.case_indent;
+	/* statements should be two levels deeper */
+	ps.ind_level_follow += (int)opt.case_indent + 1;
 	ps.search_brace = opt.btype_2;
 	break;
 
@@ -258,7 +258,7 @@ reduce_stmt(void)
 	ps.ind_level_follow = ps.il[i];
 	/*
 	 * for the time being, we will assume that there is no else on this
-	 * if, and set the indentation level accordingly. If an else is
+	 * if, and set the indentation level accordingly. If an 'else' is
 	 * scanned, it will be fixed up later
 	 */
 	return true;

Reply via email to