Module Name:    src
Committed By:   martin
Date:           Tue Aug  3 13:34:04 UTC 2021

Modified Files:
        src/usr.sbin/sysinst: run.c

Log Message:
When reading output from a program we don't know how much it will
be - so scale the buffer (within reasonable limits).
Problem pointed out by RVP, triggered e.g. by disks with lots of GPT
partitions.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/usr.sbin/sysinst/run.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.sbin/sysinst/run.c
diff -u src/usr.sbin/sysinst/run.c:1.13 src/usr.sbin/sysinst/run.c:1.14
--- src/usr.sbin/sysinst/run.c:1.13	Sat Nov 16 20:26:59 2019
+++ src/usr.sbin/sysinst/run.c	Tue Aug  3 13:34:04 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: run.c,v 1.13 2019/11/16 20:26:59 martin Exp $	*/
+/*	$NetBSD: run.c,v 1.14 2021/08/03 13:34:04 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -176,6 +176,7 @@ collect(int kind, char **buffer, const c
 {
 	size_t nbytes;		/* Number of bytes in buffer. */
 	size_t fbytes;		/* Number of bytes in file. */
+	size_t abytes;		/* allocated size of buffer */
 	struct stat st;		/* stat information. */
 	int ch;
 	FILE *f;
@@ -198,6 +199,9 @@ collect(int kind, char **buffer, const c
 		/* Open the file. */
 		f = fopen(fileorcmd, "r");
 		if (f == NULL) {
+			if (logfp)
+				fprintf(logfp, "%s: failed to open %s\n",
+				    __func__, fileorcmd);
 			*buffer = NULL;
 			return -1;
 		}
@@ -205,25 +209,47 @@ collect(int kind, char **buffer, const c
 		/* Open the program. */
 		f = popen(fileorcmd, "r");
 		if (f == NULL) {
+			if (logfp)
+				fprintf(logfp, "%s: failed to open %s\n",
+				    __func__, fileorcmd);
 			*buffer = NULL;
 			return -1;
 		}
-		fbytes = BUFSIZE;
+		fbytes = 0;
 	}
 
 	if (fbytes == 0)
-		fbytes = BUFSIZE;
+		abytes = BUFSIZE;
+	else
+		abytes = fbytes+1;
 
 	/* Allocate the buffer size. */
-	*buffer = cp = malloc(fbytes + 1);
+	*buffer = cp = malloc(abytes);
 	if (!cp)
 		nbytes =  -1;
 	else {
 		/* Read the buffer. */
 		nbytes = 0;
-		while (nbytes < fbytes && (ch = fgetc(f)) != EOF)
+		while ((ch = fgetc(f)) != EOF) {
+			if (nbytes >= abytes-1) {
+				if (fbytes > 0 || abytes >= 512*BUFSIZE) {
+					free(cp);
+					*buffer = cp = NULL;
+					nbytes = -1;
+					break;
+				}
+				abytes *= 2;
+				*buffer = cp = realloc(cp, abytes);
+				if (!cp) {
+					nbytes =  -1;
+					break;
+				}
+
+			}
 			cp[nbytes++] = ch;
-		cp[nbytes] = 0;
+		}
+		if (cp)
+			cp[nbytes] = 0;
 	}
 
 	if (kind == T_FILE)
@@ -231,6 +257,9 @@ collect(int kind, char **buffer, const c
 	else
 		pclose(f);
 
+	if (nbytes <= 0 && logfp)
+		fprintf(logfp, "%s: failed for %s\n", __func__, fileorcmd);
+
 	return nbytes;
 }
 

Reply via email to