Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 May 2000 11:08:05 -0700 (PDT)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        "Jordan K. Hubbard" <jkh@zippy.cdrom.com>
Cc:        freebsd-current@FreeBSD.ORG
Subject:   Proposed patch for PR misc/18466
Message-ID:  <200005141808.LAA06752@apollo.backplane.com>

next in thread | raw e-mail | index | archive | help
    This is a general bounded-buffer patch for sysinstall plus it fixes
    PR misc/18466 (limited 'device name' size screws up FTP installs).
    It does not fix all the potential buffer overflows -- there are still
    a lot of strcpy's, but it gets half way there with the introduction
    and use of safe_asprintf().

    My recommendation is that (eventually) the entire program use asprintf
    rather then statically-bounded buffers to hold things.

    I don't have time to test this extensively so if the maintainer of
    sysinstall wants it (I believe that's you, Jordan!), you'll need to
    review it and perhaps test it a little then give me the commit goahead.

    Note that simply increasing the DEV_NAME_MAX as a quick solution is
    not safe, there are a couple of places where an unbounded sprintf() 
    was being used with the device name as an argument.

						-Matt

Index: anonFTP.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/anonFTP.c,v
retrieving revision 1.29
diff -u -r1.29 anonFTP.c
--- anonFTP.c	2000/01/25 19:16:31	1.29
+++ anonFTP.c	2000/05/14 17:44:11
@@ -168,7 +168,7 @@
 	return DITEM_SUCCESS; 	/* succeeds if already exists */
     }
     
-    sprintf(pwline, "%s:*:%s:%d::0:0:%s:%s:/nonexistent\n", FTP_NAME, tconf.uid, gid, tconf.comment, tconf.homedir);
+    snprintf(pwline, sizeof(pwline), "%s:*:%s:%d::0:0:%s:%s:/nonexistent\n", FTP_NAME, tconf.uid, gid, tconf.comment, tconf.homedir);
     
     fptr = fopen(_PATH_MASTERPASSWD,"a");
     if (! fptr) {
@@ -207,7 +207,7 @@
 	     ANONFTP_DIALOG_HEIGHT - 11, ANONFTP_DIALOG_WIDTH - 17,
 	     dialog_attr, border_attr);
     wattrset(ds_win, dialog_attr);
-    sprintf(title, " Path Configuration ");
+    snprintf(title, sizeof(title), " Path Configuration ");
     mvwaddstr(ds_win, ANONFTP_DIALOG_Y + 7, ANONFTP_DIALOG_X + 22, title);
     
     /** Initialize the config Data Structure **/
@@ -217,7 +217,7 @@
     SAFE_STRCPY(tconf.upload, FTP_UPLOAD);
     SAFE_STRCPY(tconf.comment, FTP_COMMENT);
     SAFE_STRCPY(tconf.homedir, FTP_HOMEDIR);
-    sprintf(tconf.uid, "%d", FTP_UID);
+    snprintf(tconf.uid, sizeof(tconf.uid), "%d", FTP_UID);
     
     /* Some more initialisation before we go into the main input loop */
     obj = initLayoutDialog(ds_win, layout, ANONFTP_DIALOG_X, ANONFTP_DIALOG_Y, &max);
@@ -250,7 +250,7 @@
     
     /*** Use defaults for any invalid values ***/
     if (atoi(tconf.uid) <= 0)
-	sprintf(tconf.uid, "%d", FTP_UID);
+	snprintf(tconf.uid, sizeof(tconf.uid), "%d", FTP_UID);
     
     if (!tconf.group[0])
 	SAFE_STRCPY(tconf.group, FTP_GROUP);
@@ -296,7 +296,7 @@
 	if (!msgYesNo("Create a welcome message file for anonymous FTP users?")) {
 	    char cmd[256];
 	    vsystem("echo Your welcome message here. > %s/etc/%s", tconf.homedir, MOTD_FILE);
-	    sprintf(cmd, "%s %s/etc/%s", variable_get(VAR_EDITOR), tconf.homedir, MOTD_FILE);
+	    snprintf(cmd, sizeof(cmd), "%s %s/etc/%s", variable_get(VAR_EDITOR), tconf.homedir, MOTD_FILE);
 	    if (!systemExecute(cmd))
 		i = DITEM_SUCCESS;
 	    else
Index: config.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/config.c,v
retrieving revision 1.156.2.1
diff -u -r1.156.2.1 config.c
--- config.c	2000/03/30 08:12:02	1.156.2.1
+++ config.c	2000/05/14 17:46:38
@@ -238,11 +238,11 @@
     for (i = 0; i < cnt; i++) {
 	char cdname[10];
 	
-	sprintf(cdname, "/cdrom%s", i ? itoa(i) : "");
+	snprintf(cdname, sizeof(cdname), "/cdrom%s", i ? itoa(i) : "");
 	if (Mkdir(cdname))
 	    msgConfirm("Unable to make mount point for: %s", cdname);
 	else
-	    fprintf(fstab, "/dev/%s\t\t%s\tcd9660\tro,noauto\t0\t0\n", devs[i]->name, cdname);
+	    fprintf(fstab, "/dev/%s\t\t%s\tcd9660\tro,noauto\t0\t0\n", devs[i]->pname, cdname);
     }
     
     /* And finally, a /proc. */
@@ -364,6 +364,8 @@
     }
 }
 
+#define URMSIZE		21
+
 /* Set up the make.conf file */
 void
 configMake_conf(char *config)
@@ -373,8 +375,8 @@
     FILE *fp;
 
     if (!file_readable(config)) {
-	char *line = malloc(21);
-	sprintf(line, "USA_RESIDENT=%s\n", USAResident ? "YES" : "NO");
+	char *line = malloc(URMSIZE);
+	snprintf(line, URMSIZE, "USA_RESIDENT=%s\n", USAResident ? "YES" : "NO");
 	lines[0] = line;
 	nlines = 1;
     }
@@ -386,7 +388,7 @@
 	    if (!strncmp(lines[i], "USA_RESIDENT", 12)) {
 		free(lines[i]);
 		lines[i] = malloc(21);	/* big enough */
-		sprintf(lines[i], "USA_RESIDENT=%s\n", USAResident ? "YES" : "NO");
+		snprintf(lines[i], URMSIZE, "USA_RESIDENT=%s\n", USAResident ? "YES" : "NO");
 	    }
 	}
     }
@@ -865,7 +867,7 @@
 	    vsystem("echo '#' >> /etc/exports");
 	    vsystem("echo '# You should replace these lines with your actual exported filesystems.' >> /etc/exports");
 	    vsystem("echo >> /etc/exports");
-	    sprintf(cmd, "%s /etc/exports", variable_get(VAR_EDITOR));
+	    snprintf(cmd, sizeof(cmd), "%s /etc/exports", variable_get(VAR_EDITOR));
 	    dialog_clear();
 	    systemExecute(cmd);
 	}
Index: devices.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/devices.c,v
retrieving revision 1.117
diff -u -r1.117 devices.c
--- devices.c	2000/03/08 18:14:19	1.117
+++ devices.c	2000/05/14 17:49:02
@@ -132,8 +132,9 @@
 
     dev = safe_malloc(sizeof(Device));
     bzero(dev, sizeof(Device));
-    if (name)
-	SAFE_STRCPY(dev->name, name);
+    if (name == NULL)
+	name = "";
+    safe_asprintf(&dev->pname, "%s", name);
     return dev;
 }
 
@@ -408,13 +409,11 @@
 		    close(fd);
 		    cp = device_names[i].description;
 		    /* Serial devices get a slip and ppp device each, if supported */
-		    newdesc = safe_malloc(strlen(cp) + 40);
-		    sprintf(newdesc, cp, "SLIP interface", try, j + 1);
+		    safe_asprintf(&newdesc, cp, "SLIP interface", try, j + 1);
 		    deviceRegister("sl0", newdesc, strdup(try), DEVICE_TYPE_NETWORK, TRUE, mediaInitNetwork,
 				   NULL, mediaShutdownNetwork, NULL);
 		    msgDebug("Add mapping for %s to sl0\n", try);
-		    newdesc = safe_malloc(strlen(cp) + 50);
-		    sprintf(newdesc, cp, "PPP interface", try, j + 1);
+		    safe_asprintf(&newdesc, cp, "PPP interface", try, j + 1);
 		    deviceRegister("ppp0", newdesc, strdup(try), DEVICE_TYPE_NETWORK, TRUE, mediaInitNetwork,
 				   NULL, mediaShutdownNetwork, NULL);
 		    if (isDebug())
@@ -440,8 +439,8 @@
 	    if (!d)
 		msgFatal("Unable to open disk %s", names[i]);
 
-	    deviceRegister(names[i], names[i], d->name, DEVICE_TYPE_DISK, FALSE,
-			   dummyInit, dummyGet, dummyShutdown, d);
+	    deviceRegister(names[i], names[i], d->name, DEVICE_TYPE_DISK, 
+		FALSE, dummyInit, dummyGet, dummyShutdown, d);
 	    if (isDebug())
 		msgDebug("Found a disk device named %s\n", names[i]);
 
@@ -453,11 +452,14 @@
 
 		    /* Got one! */
 		    snprintf(devname, sizeof devname, "/dev/%s", c1->name);
-		    dev = deviceRegister(c1->name, c1->name, strdup(devname), DEVICE_TYPE_DOS, TRUE,
-					 mediaInitDOS, mediaGetDOS, mediaShutdownDOS, NULL);
+		    dev = deviceRegister(c1->name, c1->name, strdup(devname),
+			DEVICE_TYPE_DOS, TRUE, mediaInitDOS, mediaGetDOS,
+			mediaShutdownDOS, NULL);
 		    dev->private = c1;
-		    if (isDebug())
-			msgDebug("Found a DOS partition %s on drive %s\n", c1->name, d->name);
+		    if (isDebug()) {
+			msgDebug("Found a DOS partition %s on drive %s\n", 
+			    c1->name, d->name);
+		    }
 		}
 	    }
 	}
@@ -487,7 +489,7 @@
 
     j = 0;
     for (i = 0; i < numDevs; i++) {
-	if ((!name || !strcmp(Devices[i]->name, name))
+	if ((!name || !strcmp(Devices[i]->pname, name))
 	    && (class == DEVICE_TYPE_ANY || class == Devices[i]->type))
 	    found[j++] = Devices[i];
     }
@@ -503,7 +505,7 @@
 
     j = 0;
     for (i = 0; i < numDevs; i++) {
-	if ((!name || !strcmp(Devices[i]->name, name)) &&
+	if ((!name || !strcmp(Devices[i]->pname, name)) &&
 	    (!desc || !strcmp(Devices[i]->description, desc)) &&
 	    (class == DEVICE_TYPE_ANY || class == Devices[i]->type))
 	    found[j++] = Devices[i];
@@ -543,7 +545,7 @@
     tmp = (DMenu *)safe_malloc(sizeof(DMenu) + (sizeof(dialogMenuItem) * (numdevs + 1)));
     bcopy(menu, tmp, sizeof(DMenu));
     for (i = 0; devs[i]; i++) {
-	tmp->items[i].prompt = devs[i]->name;
+	tmp->items[i].prompt = devs[i]->pname;
 	for (j = 0; j < numDevs; j++) {
 	    if (devs[i] == Devices[j]) {
 		tmp->items[i].title = Devices[j]->description;
Index: disks.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/disks.c,v
retrieving revision 1.118
diff -u -r1.118 disks.c
--- disks.c	2000/02/29 10:40:57	1.118
+++ disks.c	2000/05/14 17:49:17
@@ -146,7 +146,7 @@
     cp = variable_get(VAR_BOOTMGR);
     if (!cp) {
 	/* Figure out what kind of MBR the user wants */
-	sprintf(str, "Install Boot Manager for drive %s?", dname);
+	snprintf(str, sizeof(str), "Install Boot Manager for drive %s?", dname);
 	MenuMBRType.title = str;
 	i = dmenuOpenSimple(&MenuMBRType, FALSE);
     }
Index: dist.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/dist.c,v
retrieving revision 1.175.2.1
diff -u -r1.175.2.1 dist.c
--- dist.c	2000/03/18 08:39:45	1.175.2.1
+++ dist.c	2000/05/14 17:57:59
@@ -831,7 +831,7 @@
 	    else if (me[i].my_bit != DIST_LOCAL) {
 		status = msgYesNo("Unable to transfer the %s distribution from\n%s.\n\n"
 				  "Do you want to try to retrieve it again?",
-				  me[i].my_name, mediaDevice->name);
+				  me[i].my_name, mediaDevice->pname);
 		if (!status)
 		    --i;
 	    }
@@ -849,7 +849,7 @@
 }
 
 static void
-printSelected(char *buf, int selected, Distribution *me, int *col)
+printSelected(char *buf, int bufSize, int selected, Distribution *me, int *col)
 {
     int i;
 
@@ -869,10 +869,10 @@
 	    *col = 0;
 	    strcat(buf, "\n");
 	}
-	sprintf(&buf[strlen(buf)], " %s", me[i].my_name);
+	snprintf(&buf[strlen(buf)], bufSize - strlen(buf), " %s", me[i].my_name);
 	/* Recurse if have a sub-distribution */
 	if (me[i].my_dist)
-	    printSelected(buf, *(me[i].my_mask), me[i].my_dist, col);
+	    printSelected(buf, bufSize, *(me[i].my_mask), me[i].my_dist, col);
     }
 }
 
@@ -934,7 +934,7 @@
 
 	buf[0] = '\0';
 	dialog_clear_norefresh();
-	printSelected(buf, Dists, DistTable, &col);
+	printSelected(buf, sizeof(buf), Dists, DistTable, &col);
 	dialog_clear_norefresh();
 	if (col) {
 	    msgConfirm("Couldn't extract the following distributions.  This may\n"
Index: doc.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/doc.c,v
retrieving revision 1.29
diff -u -r1.29 doc.c
--- doc.c	2000/02/26 12:35:00	1.29
+++ doc.c	2000/05/14 17:56:30
@@ -113,7 +113,7 @@
 	    where = strcpy(target, "http://www.freebsd.org/handbook");
     }
     if (where) {
-	sprintf(tmp, "%s %s", browser, target);
+	snprintf(tmp, sizeof(tmp), "%s %s", browser, target);
 	systemExecute(tmp);
 	return DITEM_SUCCESS;
     }
Index: floppy.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/floppy.c,v
retrieving revision 1.34
diff -u -r1.34 floppy.c
--- floppy.c	1999/08/28 01:34:12	1.34
+++ floppy.c	2000/05/14 17:28:52
@@ -95,7 +95,7 @@
     if (mount("msdos", mp, MNT_RDONLY, (caddr_t)&dosargs) == -1) {
 	if (mount("ufs", mp, MNT_RDONLY, (caddr_t)&u_args) == -1) {
 	    msgConfirm("Error mounting floppy %s (%s) on %s : %s",
-		       dev->name, dev->devname, mp, strerror(errno));
+		       dev->pname, dev->devname, mp, strerror(errno));
 	    return FALSE;
 	}
     }
Index: ftp.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/ftp.c,v
retrieving revision 1.37
diff -u -r1.37 ftp.c
--- ftp.c	1999/08/28 01:34:13	1.37
+++ ftp.c	2000/05/14 17:50:45
@@ -112,14 +112,14 @@
     if (variable_get(VAR_FTP_PASS))
 	SAFE_STRCPY(password, variable_get(VAR_FTP_PASS));
     else if (RunningAsInit)
-	sprintf(password, "installer@%s", variable_get(VAR_HOSTNAME));
+	snprintf(password, sizeof(password), "installer@%s", variable_get(VAR_HOSTNAME));
     else {
 	struct passwd *pw;
 	char *user;
 
 	pw = getpwuid(getuid());
 	user = pw ? pw->pw_name : "ftp";
-	sprintf(password, "%s@%s", user, variable_get(VAR_HOSTNAME));
+	snprintf(password, sizeof(password), "%s@%s", user, variable_get(VAR_HOSTNAME));
     }
     msgNotify("Logging in to %s@%s..", login_name, hostname);
     if ((OpenConn = ftpLogin(hostname, login_name, password, FtpPort, isDebug(), &code)) == NULL) {
@@ -216,17 +216,17 @@
 	    /* Try some alternatives */
 	    switch (nretries++) {
 	    case 1:
-		sprintf(buf, "releases/%s", file);
+		snprintf(buf, sizeof(buf), "releases/%s", file);
 		try = buf;
 		break;
 
 	    case 2:
-		sprintf(buf, "%s/%s", variable_get(VAR_RELNAME), file);
+		snprintf(buf, sizeof(buf), "%s/%s", variable_get(VAR_RELNAME), file);
 		try = buf;
 		break;
 
 	    case 3:
-		sprintf(buf, "%s/releases/%s", variable_get(VAR_RELNAME), file);
+		snprintf(buf, sizeof(buf), "%s/releases/%s", variable_get(VAR_RELNAME), file);
 		try = buf;
 		break;
 
Index: http.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/http.c,v
retrieving revision 1.2
diff -u -r1.2 http.c
--- http.c	2000/01/25 05:56:48	1.2
+++ http.c	2000/05/14 17:50:57
@@ -50,7 +50,7 @@
 	return FALSE;
     }
 
-    sprintf(req,"GET / HTTP/1.0\r\n\r\n");
+    snprintf(req, sizeof(req), "GET / HTTP/1.0\r\n\r\n");
     write(s,req,strlen(req));
 /*
  *  scan the headers of the response
@@ -119,7 +119,7 @@
 	return NULL;
     }
 						   
-    sprintf(req,"GET %s/%s/%s%s HTTP/1.0\r\n\r\n",
+    snprintf(req, sizeof(req), "GET %s/%s/%s%s HTTP/1.0\r\n\r\n",
 	    variable_get(VAR_FTP_PATH), variable_get(VAR_RELNAME),
 	    file, variable_get(VAR_HTTP_FTP_MODE));
 
Index: install.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/install.c,v
retrieving revision 1.268.2.3
diff -u -r1.268.2.3 install.c
--- install.c	2000/03/18 20:13:47	1.268.2.3
+++ install.c	2000/05/14 17:51:28
@@ -535,9 +535,9 @@
 	if (!msgYesNo("Would you like to configure any Ethernet or SLIP/PPP network devices?")) {
 	    Device *tmp = tcpDeviceSelect();
 
-	    if (tmp && !((DevInfo *)tmp->private)->use_dhcp && !msgYesNo("Would you like to bring the %s interface up right now?", tmp->name))
+	    if (tmp && !((DevInfo *)tmp->private)->use_dhcp && !msgYesNo("Would you like to bring the %s interface up right now?", tmp->pname))
 		if (!tmp->init(tmp))
-		    msgConfirm("Initialization of %s device failed.", tmp->name);
+		    msgConfirm("Initialization of %s device failed.", tmp->pname);
 	}
 	dialog_clear_norefresh();
     }
@@ -907,7 +907,7 @@
     command_clear();
     if (swapdev && RunningAsInit) {
 	/* As the very first thing, try to get ourselves some swap space */
-	sprintf(dname, "/dev/%s", swapdev->name);
+	snprintf(dname, sizeof(dname), "/dev/%s", swapdev->name);
 	if (!Fake && (!MakeDevChunk(swapdev, "/dev") || !file_readable(dname))) {
 	    msgConfirm("Unable to make device node for %s in /dev!\n"
 		       "The creation of filesystems will be aborted.", dname);
@@ -929,7 +929,7 @@
 
     if (rootdev && RunningAsInit) {
 	/* Next, create and/or mount the root device */
-	sprintf(dname, "/dev/r%s", rootdev->name);
+	snprintf(dname, sizeof(dname), "/dev/r%s", rootdev->name);
 	if (!Fake && (!MakeDevChunk(rootdev, "/dev") || !file_readable(dname))) {
 	    msgConfirm("Unable to make device node for %s in /dev!\n"
 		       "The creation of filesystems will be aborted.", dname);
@@ -964,7 +964,7 @@
 	}
 
 	/* Switch to block device */
-	sprintf(dname, "/dev/%s", rootdev->name);
+	snprintf(dname, sizeof(dname), "/dev/%s", rootdev->name);
 	if (Mount("/mnt", dname)) {
 	    msgConfirm("Unable to mount the root file system on %s!  Giving up.", dname);
 	    return DITEM_FAILURE | DITEM_RESTORE;
@@ -1012,7 +1012,7 @@
 
 			if (c2 == swapdev)
 			    continue;
-			sprintf(fname, "%s/dev/%s", RunningAsInit ? "/mnt" : "", c2->name);
+			snprintf(fname, sizeof(fname), "%s/dev/%s", RunningAsInit ? "/mnt" : "", c2->name);
 			i = (Fake || swapon(fname));
 			if (!i) {
 			    dialog_clear_norefresh();
@@ -1027,7 +1027,7 @@
 	    else if (c1->type == fat && c1->private_data && (root->newfs || upgrade)) {
 		char name[FILENAME_MAX];
 
-		sprintf(name, "%s/%s", RunningAsInit ? "/mnt" : "", ((PartInfo *)c1->private_data)->mountpoint);
+		snprintf(name, sizeof(name), "%s/%s", RunningAsInit ? "/mnt" : "", ((PartInfo *)c1->private_data)->mountpoint);
 		Mkdir(name);
 	    }
 	}
Index: label.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/label.c,v
retrieving revision 1.98
diff -u -r1.98 label.c
--- label.c	2000/02/29 10:40:59	1.98
+++ label.c	2000/05/14 17:51:49
@@ -899,7 +899,7 @@
 		char osize[80];
 		u_long flags = 0;
 
-		sprintf(osize, "%d", sz);
+		snprintf(osize, sizeof(osize), "%d", sz);
 		val = msgGetInput(osize,
 				  "Please specify the partition size in blocks or append a trailing G for\n"
 				  "gigabytes, M for megabytes, or C for cylinders.\n"
@@ -1095,7 +1095,7 @@
 
 		    if (!devs[i]->enabled)
 			continue;
-		    else if ((d = Open_Disk(devs[i]->name)) != NULL) {
+		    else if ((d = Open_Disk(devs[i]->pname)) != NULL) {
 			Free_Disk(devs[i]->private);
 			devs[i]->private = d;
 			diskPartition(devs[i]);
@@ -1160,7 +1160,7 @@
 
 	default:
 	    beep();
-	    sprintf(_msg, "Invalid key %d - Type F1 or ? for help", key);
+	    snprintf(_msg, sizeof(_msg), "Invalid key %d - Type F1 or ? for help", key);
 	    msg = _msg;
 	    break;
 	}
Index: media.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/media.c,v
retrieving revision 1.107
diff -u -r1.107 media.c
--- media.c	2000/01/25 05:56:49	1.107
+++ media.c	2000/05/14 17:52:24
@@ -351,7 +351,12 @@
 	variable_unset(VAR_FTP_PATH);
 	return DITEM_FAILURE;
     }
-    SAFE_STRCPY(ftpDevice.name, cp);
+    if (ftpDevice.pname) {
+	free(ftpDevice.pname);
+	ftpDevice.pname = NULL;
+    }
+    safe_asprintf(&ftpDevice.pname, "%s", cp);
+
     SAFE_STRCPY(hostname, cp + 6);
 
     if (!networkDev || msgYesNo("You've already done the network configuration once,\n"
@@ -489,10 +494,14 @@
 	return DITEM_FAILURE;
 
     /* If they gave us a CDROM or something, try and pick a better name */
+    if (ufsDevice.pname) {
+	free(ufsDevice.pname);
+	ufsDevice.pname = NULL;
+    }
     if (statfs(cp, &st))
-	strcpy(ufsDevice.name, "ufs");
+	safe_asprintf(&ufsDevice.pname, "ufs");
     else
-	strcpy(ufsDevice.name, st.f_fstypename);
+	safe_asprintf(&ufsDevice.pname, "%s", st.f_fstypename);
 
     ufsDevice.type = DEVICE_TYPE_UFS;
     ufsDevice.init = dummyInit;
@@ -522,8 +531,12 @@
 	msgConfirm("Invalid NFS path specification.  Must be of the form:\n"
 		   "host:/full/pathname/to/FreeBSD/distdir");
 	return DITEM_FAILURE;
+    }
+    if (nfsDevice.pname) {
+	free(nfsDevice.pname);
+	nfsDevice.pname = NULL;
     }
-    SAFE_STRCPY(nfsDevice.name, hostname);
+    safe_asprintf(&nfsDevice.pname, "%s", hostname);
     *idx = '\0';
     if (!networkDev || msgYesNo("You've already done the network configuration once,\n"
 				"would you like to skip over it now?") != 0) {
Index: misc.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/misc.c,v
retrieving revision 1.40
diff -u -r1.40 misc.c
--- misc.c	1999/11/27 14:33:07	1.40
+++ misc.c	2000/05/14 17:55:41
@@ -34,6 +34,7 @@
 #include "sysinstall.h"
 #include <ctype.h>
 #include <unistd.h>
+#include <stdarg.h>
 #include <sys/stat.h>
 #include <sys/errno.h>
 #include <sys/file.h>
@@ -209,6 +210,17 @@
     if (!ptr)
 	msgFatal("Out of memory!");
     return ptr;
+}
+
+void
+safe_asprintf(char **pptr, const char *ctl, ...)
+{
+    va_list va;
+
+    va_start(va, ctl);
+    if (vasprintf(pptr, ctl, va) < 0)
+	msgFatal("Out of memory!");
+    va_end(va);
 }
 
 /* Create a path biased from the VAR_INSTALL_ROOT variable (if not /) */
Index: network.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/network.c,v
retrieving revision 1.46
diff -u -r1.46 network.c
--- network.c	1999/12/17 02:46:04	1.46
+++ network.c	2000/05/14 17:36:20
@@ -61,7 +61,7 @@
 	return TRUE;
 
     if (isDebug())
-	msgDebug("Init routine called for network device %s.\n", dev->name);
+	msgDebug("Init routine called for network device %s.\n", dev->pname);
 
     if (!file_readable("/etc/resolv.conf")) {
 	if (DITEM_STATUS(configResolv(NULL)) == DITEM_FAILURE) {
@@ -79,7 +79,7 @@
 	kill(pppPID, SIGTERM);
 	pppPID = 0;
     }
-    if (!strncmp("ppp", dev->name, 3)) {	/* PPP? */
+    if (!strncmp("ppp", dev->pname, 3)) {	/* PPP? */
 	if (!(pppPID = startPPP(dev))) {
 	    msgConfirm("Unable to start PPP!  This installation method cannot be used.");
 	    return FALSE;
@@ -87,7 +87,7 @@
 	networkInitialized = TRUE;
 	return TRUE;
     }
-    else if (!strncmp("sl", dev->name, 2)) {	/* SLIP? */
+    else if (!strncmp("sl", dev->pname, 2)) {	/* SLIP? */
 	char *val;
 	char attach[256];
 
@@ -123,20 +123,20 @@
 	restorescr(w);
     }
 
-    snprintf(ifconfig, 255, "%s%s", VAR_IFCONFIG, dev->name);
+    snprintf(ifconfig, sizeof(ifconfig), "%s%s", VAR_IFCONFIG, dev->pname);
     cp = variable_get(ifconfig);
     if (!cp) {
 	msgConfirm("The %s device is not configured.  You will need to do so\n"
-		   "in the Networking configuration menu before proceeding.", dev->name);
+		   "in the Networking configuration menu before proceeding.", dev->pname);
 	return FALSE;
     }
     else if (!strcmp(cp, "DHCP"))
 	goto bail;
-    msgDebug("ifconfig %s %s", dev->name, cp);
-    i = vsystem("ifconfig %s %s", dev->name, cp);
+    msgDebug("ifconfig %s %s", dev->pname, cp);
+    i = vsystem("ifconfig %s %s", dev->pname, cp);
     if (i) {
 	msgConfirm("Unable to configure the %s interface!\n"
-		   "This installation method cannot be used.", dev->name);
+		   "This installation method cannot be used.", dev->pname);
 	return FALSE;
     }
 
@@ -164,20 +164,20 @@
     if (!RunningAsInit || !networkInitialized)
 	return;
 
-    msgDebug("Shutdown called for network device %s\n", dev->name);
+    msgDebug("Shutdown called for network device %s\n", dev->pname);
     /* Not a serial device? */
-    if (strncmp("sl", dev->name, 2) && strncmp("ppp", dev->name, 3)) {
+    if (strncmp("sl", dev->pname, 2) && strncmp("ppp", dev->pname, 3)) {
 	int i;
 	char ifconfig[255];
 
-	snprintf(ifconfig, 255, "%s%s", VAR_IFCONFIG, dev->name);
+	snprintf(ifconfig, sizeof(ifconfig), "%s%s", VAR_IFCONFIG, dev->pname);
 	cp = variable_get(ifconfig);
 	if (!cp)
 	    return;
-	msgDebug("ifconfig %s down", dev->name);
-	i = vsystem("ifconfig %s down", dev->name);
+	msgDebug("ifconfig %s down", dev->pname);
+	i = vsystem("ifconfig %s down", dev->pname);
 	if (i)
-	    msgConfirm("Warning: Unable to down the %s interface properly", dev->name);
+	    msgConfirm("Warning: Unable to down the %s interface properly", dev->pname);
 	cp = variable_get(VAR_GATEWAY);
 	if (cp) {
 	    msgDebug("Deleting default route.");
Index: nfs.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/nfs.c,v
retrieving revision 1.21
diff -u -r1.21 nfs.c
--- nfs.c	1999/12/17 02:46:04	1.21
+++ nfs.c	2000/05/14 17:36:36
@@ -59,11 +59,11 @@
     if (Mkdir(mountpoint))
 	return FALSE;
 
-    msgNotify("Mounting %s over NFS on %s", dev->name, mountpoint);
+    msgNotify("Mounting %s over NFS on %s", dev->pname, mountpoint);
     if (vsystem("mount_nfs %s %s %s %s",
 		variable_get(VAR_SLOW_ETHER) ? "-r 1024 -w 1024" : "",
-		variable_get(VAR_NFS_SECURE) ? "-P" : "", dev->name, mountpoint)) {
-	msgConfirm("Error mounting %s on %s: %s.", dev->name, mountpoint, strerror(errno));
+		variable_get(VAR_NFS_SECURE) ? "-P" : "", dev->pname, mountpoint)) {
+	msgConfirm("Error mounting %s on %s: %s.", dev->pname, mountpoint, strerror(errno));
 	if (netDevice)
 	    netDevice->shutdown(netDevice);
 	restorescr(w);
@@ -71,7 +71,7 @@
     }
     NFSMounted = TRUE;
     if (isDebug())
-	msgDebug("Mounted NFS device %s onto %s\n", dev->name, mountpoint);
+	msgDebug("Mounted NFS device %s onto %s\n", dev->pname, mountpoint);
     restorescr(w);
     return TRUE;
 }
Index: options.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/options.c,v
retrieving revision 1.70
diff -u -r1.70 options.c
--- options.c	1999/12/19 20:41:06	1.70
+++ options.c	2000/05/14 17:52:30
@@ -165,7 +165,7 @@
 	return (char *)opt.data;
 
     case OPT_IS_INT:
-	sprintf(ival, "%d", (int)opt.data);
+	snprintf(ival, sizeof(ival), "%d", (int)opt.data);
 	return ival;
 
     case OPT_IS_FUNC:
Index: package.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/package.c,v
retrieving revision 1.90.2.1
diff -u -r1.90.2.1 package.c
--- package.c	2000/03/18 08:45:35	1.90.2.1
+++ package.c	2000/05/14 17:52:48
@@ -144,12 +144,12 @@
 
     if (!index(name, '/')) {
 	if (!strpbrk(name, "-_"))
-	    sprintf(path, "packages/Latest/%s.tgz", name);
+	    snprintf(path, sizeof(path), "packages/Latest/%s.tgz", name);
 	else
-	    sprintf(path, "packages/All/%s%s", name, strstr(name, ".tgz") ? "" : ".tgz");
+	    snprintf(path, sizeof(path), "packages/All/%s%s", name, strstr(name, ".tgz") ? "" : ".tgz");
     }
     else
-	sprintf(path, "%s%s", name, strstr(name, ".tgz") ? "" : ".tgz");
+	snprintf(path, sizeof(path), "%s%s", name, strstr(name, ".tgz") ? "" : ".tgz");
 
     /* We have a path, call the device strategy routine to get the file */
     fp = dev->get(dev, path, TRUE);
@@ -162,7 +162,7 @@
 	signal(SIGPIPE, catch_pipe);
 
         dialog_clear_norefresh();
-	msgNotify("Adding %s%s\nfrom %s", path, depended ? " (as a dependency)" : "", dev->name);
+	msgNotify("Adding %s%s\nfrom %s", path, depended ? " (as a dependency)" : "", dev->pname);
 	pipe(pfd);
 	pid = fork();
 	if (!pid) {
Index: pccard.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/pccard.c,v
retrieving revision 1.10
diff -u -r1.10 pccard.c
--- pccard.c	2000/01/14 19:05:55	1.10
+++ pccard.c	2000/05/14 17:52:56
@@ -79,7 +79,7 @@
 	return;
     }
 
-    sprintf(card_device, CARD_DEVICE, 0);
+    snprintf(card_device, sizeof(card_device), CARD_DEVICE, 0);
 
     if ((fd = open(card_device, O_RDWR)) < 0) {
 	msgDebug("Can't open PC-card controller %s.\n", 
Index: sysinstall.h
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/sysinstall.h,v
retrieving revision 1.186
diff -u -r1.186 sysinstall.h
--- sysinstall.h	2000/03/12 03:57:26	1.186
+++ sysinstall.h	2000/05/14 17:56:04
@@ -55,7 +55,6 @@
 /*** Defines ***/
 
 /* device limits */
-#define DEV_NAME_MAX		64	/* The maximum length of a device name	*/
 #define DEV_MAX			100	/* The maximum number of devices we'll deal with */
 #define INTERFACE_MAX		50	/* Maximum number of network interfaces we'll deal with */
 #define IO_ERROR		-2	/* Status code for I/O error rather than normal EOF */
@@ -250,7 +249,7 @@
 
 /* A "device" from sysinstall's point of view */
 typedef struct _device {
-    char name[DEV_NAME_MAX];
+    char *pname;
     char *description;
     char *devname;
     DeviceType type;
@@ -640,6 +639,7 @@
 extern void	safe_free(void *ptr);
 extern void	*safe_malloc(size_t size);
 extern void	*safe_realloc(void *orig, size_t size);
+extern void	safe_asprintf(char **pptr, const char *ctl, ...);
 extern dialogMenuItem *item_add(dialogMenuItem *list, char *prompt, char *title, 
 				int (*checked)(dialogMenuItem *self),
 				int (*fire)(dialogMenuItem *self),
Index: tape.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/tape.c,v
retrieving revision 1.22
diff -u -r1.22 tape.c
--- tape.c	1999/12/17 02:46:04	1.22
+++ tape.c	2000/05/14 17:53:07
@@ -70,7 +70,7 @@
     if (!tapeInitted) {
 	WINDOW *w = savescr();
 
-	msgDebug("Tape init routine called for %s (private dir is %s)\n", dev->name, dev->private);
+	msgDebug("Tape init routine called for %s (private dir is %s)\n", dev->pname, dev->private);
 	Mkdir(dev->private);
 	if (chdir(dev->private)) {
 	    msgConfirm("Unable to CD to %s before extracting tape!\n"
@@ -79,7 +79,7 @@
 	}
 	/* We know the tape is already in the drive, so go for it */
 	msgNotify("First extracting distributions from %s...", dev->description);
-	if (!strcmp(dev->name, "rft0"))
+	if (!strcmp(dev->pname, "rft0"))
 	    i = vsystem("ft | cpio -idum %s --block-size %s", cpioVerbosity(), mediaTapeBlocksize());
 	else
 	    i = vsystem("cpio -idum %s --block-size %s -I %s", cpioVerbosity(), mediaTapeBlocksize(), dev->devname);
@@ -96,13 +96,13 @@
 	restorescr(w);
     }
 
-    sprintf(buf, "%s/%s", (char *)dev->private, file);
+    snprintf(buf, sizeof(buf), "%s/%s", (char *)dev->private, file);
     if (isDebug())
 	msgDebug("Request for %s from tape (looking in %s)\n", file, buf);
     if (file_readable(buf))
 	fp = fopen(buf, "r");
     else {
-	sprintf(buf, "%s/releases/%s", (char *)dev->private, file);
+	snprintf(buf, sizeof(buf), "%s/releases/%s", (char *)dev->private, file);
 	fp = fopen(buf, "r");
     }
     /* Nuke the files behind us to save space */
Index: tcpip.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/tcpip.c,v
retrieving revision 1.103
diff -u -r1.103 tcpip.c
--- tcpip.c	2000/02/20 21:58:10	1.103
+++ tcpip.c	2000/05/14 17:53:32
@@ -157,7 +157,7 @@
 	int i, j;
 
 	/* Bah, now we have to kludge getting the information from ifconfig */
-	snprintf(cmd, sizeof cmd, "ifconfig %s", devp->name);
+	snprintf(cmd, sizeof cmd, "ifconfig %s", devp->pname);
 	ifp = popen(cmd, "r");
 	if (ifp) {
 	    j = fread(data, 1, sizeof(data), ifp);
@@ -224,7 +224,7 @@
 	    Mkdir("/var/run");
 	    Mkdir("/tmp");
 	    msgNotify("Scanning for DHCP servers...");
-	    if (0 == vsystem("dhclient -1 %s", devp->name)) {
+	    if (0 == vsystem("dhclient -1 %s", devp->pname)) {
 		dhcpGetInfo(devp);
 		use_dhcp = TRUE;
 	    }
@@ -240,7 +240,7 @@
 	if (!ipaddr[0]) {
 	    if ((cp = variable_get(VAR_IPADDR)) != NULL)
 		SAFE_STRCPY(ipaddr, cp);
-	    else if ((cp = variable_get(string_concat3(devp->name, "_", VAR_IPADDR))) != NULL)
+	    else if ((cp = variable_get(string_concat3(devp->pname, "_", VAR_IPADDR))) != NULL)
 		SAFE_STRCPY(ipaddr, cp);
 	}
 
@@ -248,7 +248,7 @@
 	if (!netmask[0]) {
 	    if ((cp = variable_get(VAR_NETMASK)) != NULL)
 		SAFE_STRCPY(netmask, cp);
-	    else if ((cp = variable_get(string_concat3(devp->name, "_", VAR_NETMASK))) != NULL)
+	    else if ((cp = variable_get(string_concat3(devp->pname, "_", VAR_NETMASK))) != NULL)
 		SAFE_STRCPY(netmask, cp);
 	}
 
@@ -256,7 +256,7 @@
 	if (!extras[0]) {
 	    if ((cp = variable_get(VAR_EXTRAS)) != NULL)
 		SAFE_STRCPY(extras, cp);
-	    else if ((cp = variable_get(string_concat3(devp->name, "_", VAR_EXTRAS))) != NULL)
+	    else if ((cp = variable_get(string_concat3(devp->pname, "_", VAR_EXTRAS))) != NULL)
 		SAFE_STRCPY(extras, cp);
 	}
     }
@@ -310,7 +310,7 @@
     draw_box(ds_win, TCP_DIALOG_Y + 9, TCP_DIALOG_X + 8, TCP_DIALOG_HEIGHT - 13, TCP_DIALOG_WIDTH - 17,
 	     dialog_attr, border_attr);
     wattrset(ds_win, dialog_attr);
-    sprintf(title, " Configuration for Interface %s ", devp->name);
+    snprintf(title, sizeof(title), " Configuration for Interface %s ", devp->pname);
     mvwaddstr(ds_win, TCP_DIALOG_Y + 9, TCP_DIALOG_X + 14, title);
 
     /* Some more initialisation before we go into the main input loop */
@@ -383,11 +383,11 @@
 	SAFE_STRCPY(di->extras, extras);
 	di->use_dhcp = use_dhcp;
 
-	sprintf(ifn, "%s%s", VAR_IFCONFIG, devp->name);
+	snprintf(ifn, sizeof(ifn), "%s%s", VAR_IFCONFIG, devp->pname);
 	if (use_dhcp)
-	    sprintf(temp, "DHCP");
+	    snprintf(temp, sizeof(temp), "DHCP");
 	else
-	    sprintf(temp, "inet %s %s netmask %s", ipaddr, extras, netmask);
+	    snprintf(temp, sizeof(temp), "inet %s %s netmask %s", ipaddr, extras, netmask);
 	variable_set2(ifn, temp, 1);
 	pccard = variable_get("_pccard_install");
 	if (pccard && strcmp(pccard, "YES") == 0) {
@@ -397,8 +397,8 @@
 	if (!ifaces)
 	    variable_set2(VAR_INTERFACES, ifaces = "lo0", 1);
 	/* Only add it if it's not there already */
- 	if (strcmp(ifaces, "auto") && !strstr(ifaces, devp->name)) {
-	    sprintf(ifn, "%s %s", devp->name, ifaces);
+ 	if (strcmp(ifaces, "auto") && !strstr(ifaces, devp->pname)) {
+	    snprintf(ifn, sizeof(ifn), "%s %s", devp->pname, ifaces);
 	    variable_set2(VAR_INTERFACES, ifn, 1);
 	}
 	if (!use_dhcp)
@@ -481,8 +481,8 @@
     Device *tmp;
 
     tmp = tcpDeviceSelect();
-    if (tmp && tmp->private && !((DevInfo *)tmp->private)->use_dhcp && !msgYesNo("Would you like to bring the %s interface up right now?", tmp->name))
+    if (tmp && tmp->private && !((DevInfo *)tmp->private)->use_dhcp && !msgYesNo("Would you like to bring the %s interface up right now?", tmp->pname))
 	if (!tmp->init(tmp))
-	    msgConfirm("Initialization of %s device failed.", tmp->name);
+	    msgConfirm("Initialization of %s device failed.", tmp->pname);
     return DITEM_SUCCESS;
 }
Index: wizard.c
===================================================================
RCS file: /home/ncvs/src/release/sysinstall/wizard.c,v
retrieving revision 1.15
diff -u -r1.15 wizard.c
--- wizard.c	1999/08/28 01:34:22	1.15
+++ wizard.c	2000/05/14 17:53:40
@@ -70,7 +70,7 @@
     char **cp,*cmds[200];
     int ncmd,i;
 
-    sprintf(myprompt,"%s> ", d->name);
+    snprintf(myprompt, sizeof(myprompt), "%s> ", d->name);
     while(1) {
 	printf("--==##==--\n");
 	Debug_Disk(d);


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200005141808.LAA06752>