# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.688   -> 1.689  
#	drivers/usb/core/usb.c	1.68    -> 1.69   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/07/22	ch@hpl.hp.com	1.689
# [PATCH] set_device_description oops fixage mk2
# 
# Unlike previous version, this one doesn't oops and is perspicuous.
# Please apply.
# --------------------------------------------
#
diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
--- a/drivers/usb/core/usb.c	Mon Jul 22 17:11:10 2002
+++ b/drivers/usb/core/usb.c	Mon Jul 22 17:11:10 2002
@@ -1288,56 +1288,59 @@
  */
 static void set_device_description (struct usb_device *dev)
 {
-	char	*buf, *here, *end;
+	void    *buf;
 	int	mfgr = dev->descriptor.iManufacturer;
 	int	prod = dev->descriptor.iProduct;
+	int	vendor_id = dev->descriptor.idVendor;
+	int	product_id = dev->descriptor.idProduct;
+	char	*mfgr_str, *prod_str;
 
-	/* set default; keep it if there are no strings */
+	/* set default; keep it if there are no strings, or kmalloc fails */
 	sprintf (dev->dev.name, "USB device %04x:%04x",
-		 dev->descriptor.idVendor,
-		 dev->descriptor.idProduct);
-	if (!mfgr && !prod)
-		return;
+		 vendor_id, product_id);
 
-	if (!(buf = kmalloc(256, GFP_KERNEL)))
+	if (!(buf = kmalloc(256 * 2, GFP_KERNEL)))
 		return;
-	here = dev->dev.name;
-	end = here + sizeof dev->dev.name - 2;
-	*end = 0;
+	
+	prod_str = (char *) buf;
+	mfgr_str = (char *) buf + 256;
 
-	/* much like pci ... describe as either:
-	 * - both strings:   'product descr (vendor descr)'
-	 * - product only:   'product descr (USB device vvvv:pppp)'
-	 * - vendor only:    'USB device vvvv:pppp (vendor descr)'
-	 * - neither string: 'USB device vvvv:pppp'
-	 */
-	if (prod && usb_string (dev, prod, buf, 256) > 0) {
-		strncpy (here, buf, end - here);
+	if (prod && usb_string (dev, prod, prod_str, 256) > 0) {
 #ifdef DEBUG
-		printk (KERN_INFO "Product: %s\n", buf);
+		printk (KERN_INFO "Product: %s\n", prod_str);
 #endif
 	} else {
-		buf [0] = 0;
-		prod = -1;
+		prod_str = 0;
 	}
-	here = strchr (here, 0);
-	if (mfgr && usb_string (dev, mfgr, buf, 256) > 0) {
-		*here++ = ' ';
-		*here++ = '(';
-		strncpy (here, buf, end - here - 1);
-		here = strchr (here, 0);
-		*here++ = ')';
+
+	if (mfgr && usb_string (dev, mfgr, mfgr_str, 256) > 0) {
 #ifdef DEBUG
-		printk (KERN_INFO "Manufacturer: %s\n", buf);
+		printk (KERN_INFO "Manufacturer: %s\n", mfgr_str);
 #endif
 	} else {
-		if (prod != -1)
-			snprintf (here, end - here - 1,
-				" (USB device %04x:%04x)",
-				dev->descriptor.idVendor,
-				dev->descriptor.idProduct);
-		/* both strings unavailable, keep the default */
+		mfgr_str = 0;
+	}
+
+	/* much like pci ... describe as either:
+	 * - both strings:   'product descr (vendor descr)'
+	 * - product only:   'product descr (USB device vvvv:pppp)'
+	 * - vendor only:    'USB device vvvv:pppp (vendor descr)'
+	 * - neither string: 'USB device vvvv:pppp'
+	 */
+
+	if (prod_str && mfgr_str) {
+		snprintf(dev->dev.name, sizeof dev->dev.name,
+			 "%s (%s)", prod_str, mfgr_str);
+	} else if (prod_str) {
+		snprintf(dev->dev.name, sizeof dev->dev.name,
+			 "%s (USB device %04x:%04x)",
+			 prod_str, vendor_id, product_id);
+	} else if (mfgr_str) {
+		snprintf(dev->dev.name, sizeof dev->dev.name,
+			 "USB device %04x:%04x (%s)",
+			 vendor_id, product_id, mfgr_str);
 	}
+
 	kfree(buf);
 }
 
