Problems with setting devices' bus_id on sparc32

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

While investigating Debian bug #394697 [0] on sparc32, I've found that 
in a couple of places the bus_id field of struct device is set by 
copying the dp->path_component_name (obtained from prom) without any 
length checking. In most cases it happens to work, however on 
SparcStation5 for some devices this string is over 20 chars long (like 
'power-management@4,a0000000'), and that exceeds the amount of memory 
allocated for bus_id (which is BUS_ID_SIZE == 20). So, blindly 
copying the names into bus_id using strcpy() leads to all kinds of bad 
things. The attached hackish patch replaces strcpy() by strlcpy() in 
two places, making it possible to boot SS5 again (tested in QEMU, 
where vanilla 2.6.18 fails to boot with symptoms identical to the ones
described in the bug).

[0] http://bugs.debian.org/394697

Best regards,
-- 
Jurij Smakov                                           jurij@xxxxxxxxx
Key: http://www.wooyd.org/pgpkey/                      KeyID: C99E03CC
diff -aur a/arch/sparc/kernel/of_device.c b/arch/sparc/kernel/of_device.c
--- a/arch/sparc/kernel/of_device.c	2006-09-19 20:42:06.000000000 -0700
+++ b/arch/sparc/kernel/of_device.c	2006-10-26 22:53:50.000000000 -0700
@@ -652,7 +652,7 @@
 	if (!parent)
 		strcpy(op->dev.bus_id, "root");
 	else
-		strcpy(op->dev.bus_id, dp->path_component_name);
+		strlcpy(op->dev.bus_id, dp->path_component_name, BUS_ID_SIZE);
 
 	if (of_device_register(op)) {
 		printk("%s: Could not register of device.\n",
diff -aur a/drivers/sbus/sbus.c b/drivers/sbus/sbus.c
--- a/drivers/sbus/sbus.c	2006-09-19 20:42:06.000000000 -0700
+++ b/drivers/sbus/sbus.c	2006-10-26 22:53:19.000000000 -0700
@@ -61,7 +61,7 @@
 	else
 		sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev;
 	sdev->ofdev.dev.bus = &sbus_bus_type;
-	strcpy(sdev->ofdev.dev.bus_id, dp->path_component_name);
+	strlcpy(sdev->ofdev.dev.bus_id, dp->path_component_name, BUS_ID_SIZE);
 
 	if (of_device_register(&sdev->ofdev) != 0)
 		printk(KERN_DEBUG "sbus: device registration error for %s!\n",

[Index of Archives]     [Kernel Development]     [DCCP]     [Linux ARM Development]     [Linux]     [Photo]     [Yosemite Help]     [Linux ARM Kernel]     [Linux SCSI]     [Linux x86_64]     [Linux Hams]

  Powered by Linux