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);
}