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).
This commit is contained in:
rillig 2021-10-05 06:55:24 +00:00
parent ed959c6f7e
commit 54a4dc048b
2 changed files with 23 additions and 30 deletions

View File

@ -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.17 (Berkeley) 6/7/93";
#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, bool tabs_to_var, bool sp_sw)
*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 tabs_to_var)
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++;

View File

@ -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;