Date: Thu, 24 Mar 2005 12:20:48 +0100 From: Hans Petter Selasky <hselasky@c2i.net> To: FreeBSD-gnats-submit@FreeBSD.org Subject: usb/79190: usbd_get_string_desc() is called with the wrong lang ID Message-ID: <200503241220.49524.hselasky@c2i.net> Resent-Message-ID: <200503241130.j2OBU200074156@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 79190 >Category: usb >Synopsis: usbd_get_string_desc() is called with the wrong lang ID >Confidential: no >Severity: critical >Priority: medium >Responsible: freebsd-usb >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu Mar 24 11:30:02 GMT 2005 >Closed-Date: >Last-Modified: >Originator: HPS >Release: FreeBSD 6.0-CURRENT i386 >Organization: >Environment: System: FreeBSD 6.0-CURRENT FreeBSD 6.0-CURRENT #45: Mon Mar 21 15:40:17 CET 2005 root@:/usr/obj/usr/src/sys/custom i386 >Description: In the file "/sys/dev/usb/uhub.c" in the function "uhub_child_pnpinfo_str" usbd_get_string_desc() is called with the wrong language parameter (0). This [invalid] request causes some devices not to work at all! >How-To-Repeat: >Fix: The solution is to call usbd_get_string() which will setup the correct language parameter, instead of usbd_get_string_desc() --- uhub.c.ref Thu Mar 24 12:07:36 2005 +++ uhub.c Thu Mar 24 12:15:12 2005 @@ -664,13 +664,11 @@ struct uhub_softc *sc = device_get_softc(cbdev); usbd_device_handle devhub = sc->sc_hub; usbd_device_handle dev; - usb_string_descriptor_t us; struct usbd_interface *iface; char serial[128]; int nports; int port; - int i, j, size; - int err; + int i; nports = devhub->hub->hubdesc.bNbrPorts; for (port = 0; port < nports; port++) { @@ -688,18 +686,10 @@ return (0); found_dev: - j = 0; + serial[0] = '\0'; if (dev->ddesc.iSerialNumber != 0) { - err = usbd_get_string_desc(dev, dev->ddesc.iSerialNumber, 0, - &us, &size); - if (err == 0) { - do { - serial[j] = UGETW(us.bString[j]); - j++; - } while (j < ((us.bLength - 2) / 2)); - } + (void) usbd_get_string(dev, dev->ddesc.iSerialNumber, &serial[0]); } - serial[j] = '\0'; if (dev->ifacenums == NULL) { snprintf(buf, buflen, "vendor=0x%04x product=0x%04x " "devclass=0x%02x devsubclass=0x%02x " Here is another bugfix: *** sys/dev/usb/umass.c.ref Wed Nov 17 18:56:27 2004 --- sys/dev/usb/umass.c Thu Dec 2 12:39:51 2004 *************** *** 110,115 **** --- 110,116 ---- #include <sys/systm.h> #include <sys/kernel.h> #include <sys/module.h> + #include <sys/malloc.h> #include <sys/bus.h> #include <sys/sysctl.h> *************** *** 928,934 **** #endif if (sc->quirks & ALT_IFACE_1) { ! err = usbd_set_interface(0, 1); if (err) { DPRINTF(UDMASS_USB, ("%s: could not switch to " "Alt Interface %d\n", --- 929,935 ---- #endif if (sc->quirks & ALT_IFACE_1) { ! err = usbd_set_interface(uaa->iface, 1); if (err) { DPRINTF(UDMASS_USB, ("%s: could not switch to " "Alt Interface %d\n", >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200503241220.49524.hselasky>