Commit 271ae4b3 authored by Christopher Hoover's avatar Christopher Hoover Committed by Greg Kroah-Hartman

[PATCH] set_device_description oops fixage mk2

Unlike previous version, this one doesn't oops and is perspicuous.
Please apply.
parent eabb444f
...@@ -1288,56 +1288,59 @@ int usb_set_address(struct usb_device *dev) ...@@ -1288,56 +1288,59 @@ int usb_set_address(struct usb_device *dev)
*/ */
static void set_device_description (struct usb_device *dev) static void set_device_description (struct usb_device *dev)
{ {
char *buf, *here, *end; void *buf;
int mfgr = dev->descriptor.iManufacturer; int mfgr = dev->descriptor.iManufacturer;
int prod = dev->descriptor.iProduct; 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", sprintf (dev->dev.name, "USB device %04x:%04x",
dev->descriptor.idVendor, vendor_id, product_id);
dev->descriptor.idProduct);
if (!mfgr && !prod)
return;
if (!(buf = kmalloc(256, GFP_KERNEL))) if (!(buf = kmalloc(256 * 2, GFP_KERNEL)))
return; return;
here = dev->dev.name;
end = here + sizeof dev->dev.name - 2;
*end = 0;
/* much like pci ... describe as either: prod_str = (char *) buf;
* - both strings: 'product descr (vendor descr)' mfgr_str = (char *) buf + 256;
* - product only: 'product descr (USB device vvvv:pppp)'
* - vendor only: 'USB device vvvv:pppp (vendor descr)' if (prod && usb_string (dev, prod, prod_str, 256) > 0) {
* - neither string: 'USB device vvvv:pppp'
*/
if (prod && usb_string (dev, prod, buf, 256) > 0) {
strncpy (here, buf, end - here);
#ifdef DEBUG #ifdef DEBUG
printk (KERN_INFO "Product: %s\n", buf); printk (KERN_INFO "Product: %s\n", prod_str);
#endif #endif
} else { } else {
buf [0] = 0; prod_str = 0;
prod = -1;
} }
here = strchr (here, 0);
if (mfgr && usb_string (dev, mfgr, buf, 256) > 0) { if (mfgr && usb_string (dev, mfgr, mfgr_str, 256) > 0) {
*here++ = ' ';
*here++ = '(';
strncpy (here, buf, end - here - 1);
here = strchr (here, 0);
*here++ = ')';
#ifdef DEBUG #ifdef DEBUG
printk (KERN_INFO "Manufacturer: %s\n", buf); printk (KERN_INFO "Manufacturer: %s\n", mfgr_str);
#endif #endif
} else { } else {
if (prod != -1) mfgr_str = 0;
snprintf (here, end - here - 1,
" (USB device %04x:%04x)",
dev->descriptor.idVendor,
dev->descriptor.idProduct);
/* both strings unavailable, keep the default */
} }
/* 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); kfree(buf);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment