Module Name:    src
Committed By:   christos
Date:           Fri Jun 28 14:42:31 UTC 2013

Modified Files:
        src/sys/arch/prep/prep: autoconf.c

Log Message:
undefined behavior, buffer overflow
http://m00nbsd.net/ae123a9bae03f7dde5c6d654412daf5a.html


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/prep/prep/autoconf.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/prep/prep/autoconf.c
diff -u src/sys/arch/prep/prep/autoconf.c:1.25 src/sys/arch/prep/prep/autoconf.c:1.26
--- src/sys/arch/prep/prep/autoconf.c:1.25	Sun Jul 29 14:05:45 2012
+++ src/sys/arch/prep/prep/autoconf.c	Fri Jun 28 10:42:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: autoconf.c,v 1.25 2012/07/29 18:05:45 mlelstv Exp $	*/
+/*	$NetBSD: autoconf.c,v 1.26 2013/06/28 14:42:31 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.25 2012/07/29 18:05:45 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.26 2013/06/28 14:42:31 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -107,6 +107,7 @@ device_register(device_t dev, void *aux)
 	device_t parent;
 	char devpath[256];
 	prop_string_t str1;
+	int n;
 
 	/* Certain devices will *never* be bootable.  short circuit them. */
 
@@ -144,17 +145,18 @@ device_register(device_t dev, void *aux)
 	}
 	parent = device_parent(dev);
 
+	n = 0;
 	if (device_is_a(dev, "pci")) {
 		if (device_is_a(parent, "ppb"))
-			sprintf(devpath, "");
+			n = snprintf(devpath, sizeof(devpath), "");
 		else
-			sprintf(devpath, "pci@%x",
+			n = snprintf(devpath, sizeof(devpath), "pci@%x",
 			    prep_io_space_tag.pbs_offset);
 	}
 	if (device_is_a(parent, "pci")) {
 		struct pci_attach_args *pa = aux;
 
-		sprintf(devpath, "pci%x,%x@%x,%x",
+		n = snprintf(devpath, sizeof(devpath), "pci%x,%x@%x,%x",
 		    PCI_VENDOR(pa->pa_id), PCI_PRODUCT(pa->pa_id),
 		    pa->pa_device, pa->pa_function);
 	}
@@ -162,42 +164,47 @@ device_register(device_t dev, void *aux)
 		struct pnpbus_dev_attach_args *pna = aux;
 		struct pnpbus_io *io;
 
-		sprintf(devpath, "%s@", pna->pna_devid);
+		n = snprintf(devpath, sizeof(devpath), "%s@",
+		    pna->pna_devid);
 		io = SIMPLEQ_FIRST(&pna->pna_res.io);
 		if (io != NULL)
-			sprintf(devpath, "%s%x", devpath, io->minbase);
+			n += snprintf(devpath + n, sizeof(devpath) - n, "%x",
+			    io->minbase);
 	}
 
 	/* we can't trust the device tag on the ethernet, because
 	 * the spec lies about how it is formed.  Therefore we will leave it
 	 * blank, and trim the end off any ethernet stuff. */
 	if (device_class(dev) == DV_IFNET)
-		sprintf(devpath, "%s:", devpath);
+		n += snprintf(devpath + n, sizeof(devpath) - n, ":");
 	else if (device_is_a(dev, "cd"))
-		sprintf(devpath, "cdrom@");
+		n = snprintf(devpath, sizeof(devpath), "cdrom@");
 	else if (device_class(dev) == DV_DISK)
-		sprintf(devpath, "harddisk@");
+		n = snprintf(devpath, sizeof(devpath), "harddisk@");
 	else if (device_class(dev) == DV_TAPE)
-		sprintf(devpath, "tape@");
+		n = snprintf(devpath, sizeof(devpath), "tape@");
 	else if (device_is_a(dev, "fd"))
-		sprintf(devpath, "floppy@");
+		n = snprintf(devpath, sizeof(devpath), "floppy@");
 
 	if (device_is_a(parent, "scsibus") || device_is_a(parent, "atapibus")) {
 		struct scsipibus_attach_args *sa = aux;
 
 		/* periph_target is target for scsi, drive # for atapi */
-		sprintf(devpath, "%s%d", devpath, sa->sa_periph->periph_target);
+		n += snprintf(devpath + n, sizeof(devpath) - n, "%d",
+		    sa->sa_periph->periph_target);
 		if (device_is_a(parent, "scsibus"))
-			sprintf(devpath, "%s,%d", devpath,
+			n += snprintf(devpath + n, sizeof(devpath) - n, ",%d",
 			    sa->sa_periph->periph_lun);
 	} else if (device_is_a(parent, "atabus") ||
 	    device_is_a(parent, "pciide")) {
 		struct ata_device *adev = aux;
 
-		sprintf(devpath, "%s%d", devpath, adev->adev_drv_data->drive);
+		n += snprintf(devpath + n, sizeof(devpath) - n, "%d",
+		    adev->adev_drv_data->drive);
 	} else if (device_is_a(dev, "fd")) {
 		/* XXX device_unit() abuse */
-		sprintf(devpath, "%s%d", devpath, device_unit(dev));
+		n += snprintf(devpath + n, sizeof(devpath) - n, "%d",
+		    device_unit(dev));
 	}
 
 	str1 = prop_string_create_cstring(devpath);

Reply via email to