From owner-freebsd-current Sun May 14 11: 8:30 2000 Delivered-To: freebsd-current@freebsd.org Received: from apollo.backplane.com (apollo.backplane.com [216.240.41.2]) by hub.freebsd.org (Postfix) with ESMTP id 4DB1137B7F1 for ; Sun, 14 May 2000 11:08:11 -0700 (PDT) (envelope-from dillon@apollo.backplane.com) Received: (from dillon@localhost) by apollo.backplane.com (8.9.3/8.9.1) id LAA06752; Sun, 14 May 2000 11:08:05 -0700 (PDT) (envelope-from dillon) Date: Sun, 14 May 2000 11:08:05 -0700 (PDT) From: Matthew Dillon Message-Id: <200005141808.LAA06752@apollo.backplane.com> To: "Jordan K. Hubbard" Cc: freebsd-current@FreeBSD.ORG Subject: Proposed patch for PR misc/18466 Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG 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 #include +#include #include #include #include @@ -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