git: f66a8328c3ef - main - bsdinstall: Replace correct, but fragile, string builder with open_memstream.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 27 Jun 2023 17:19:42 UTC
The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=f66a8328c3effcb4fbd7807b798d0288b865421d commit f66a8328c3effcb4fbd7807b798d0288b865421d Author: John Baldwin <jhb@FreeBSD.org> AuthorDate: 2023-06-27 17:19:32 +0000 Commit: John Baldwin <jhb@FreeBSD.org> CommitDate: 2023-06-27 17:19:32 +0000 bsdinstall: Replace correct, but fragile, string builder with open_memstream. The old one triggered a false positive -Warray-bounds from GCC (the compiler assumed len was always 0), but it was also fragile with manually computed lengths paired with strcat vs using a string builder. Differential Revision: https://reviews.freebsd.org/D40658 --- usr.sbin/bsdinstall/partedit/scripted.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/usr.sbin/bsdinstall/partedit/scripted.c b/usr.sbin/bsdinstall/partedit/scripted.c index 48ac94d112f2..62c36724d7c5 100644 --- a/usr.sbin/bsdinstall/partedit/scripted.c +++ b/usr.sbin/bsdinstall/partedit/scripted.c @@ -195,23 +195,26 @@ int parse_disk_config(char *input) int scripted_editor(int argc, const char **argv) { - char *token; - int i, error = 0, len = 0; + FILE *fp; + char *input, *token; + size_t len; + int i, error = 0; - for (i = 1; i < argc; i++) - len += strlen(argv[i]) + 1; - char inputbuf[len], *input = inputbuf; - strcpy(input, argv[1]); + fp = open_memstream(&input, &len); + fputs(argv[1], fp); for (i = 2; i < argc; i++) { - strcat(input, " "); - strcat(input, argv[i]); + fprintf(fp, " %s", argv[i]); } + fclose(fp); while ((token = strsep(&input, ";")) != NULL) { error = parse_disk_config(token); - if (error != 0) + if (error != 0) { + free(input); return (error); + } } + free(input); return (0); }