The branch main has been updated by jhb:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=f66a8328c3effcb4fbd7807b798d0288b865421d

commit f66a8328c3effcb4fbd7807b798d0288b865421d
Author:     John Baldwin <j...@freebsd.org>
AuthorDate: 2023-06-27 17:19:32 +0000
Commit:     John Baldwin <j...@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);
 }

Reply via email to