summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/ugen.c
diff options
context:
space:
mode:
authordlg <dlg@openbsd.org>2004-10-31 12:10:52 +0000
committerdlg <dlg@openbsd.org>2004-10-31 12:10:52 +0000
commitc60274faa6e28955c0c40805d30823f2d63d0822 (patch)
treeb2a15cb744493ac373badb7528420163727960d2 /sys/dev/usb/ugen.c
parentSimplify ldconfig handling: one single ensure_ldconfig routine that (diff)
downloadwireguard-openbsd-c60274faa6e28955c0c40805d30823f2d63d0822.tar.xz
wireguard-openbsd-c60274faa6e28955c0c40805d30823f2d63d0822.zip
from netbsd via freebsd via jsg@
usbdi_util.h (1.29), uhid.c (1.62), ugen.c (1.68), usb_subr.c (1.114) Yes, some devices return incorrect lengths in their string descriptors. Rather than losing, do what Windows does: just request the maximum size, and allow a shorter response. Obsoletes the need for UQ_NO_STRINGS, and therefore these "quirks" are removed. usb_subr.c (1.116) In the "seemed like a good idea until I found the fatal flaw" department... Attempting to read a maximum-size string descriptor causes my kue device to go completely apeshit. So, go back to the original method, but allow the device to return a shorter string than it claimed.
Diffstat (limited to 'sys/dev/usb/ugen.c')
-rw-r--r--sys/dev/usb/ugen.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/dev/usb/ugen.c b/sys/dev/usb/ugen.c
index b7f955fd601..777c2916cdd 100644
--- a/sys/dev/usb/ugen.c
+++ b/sys/dev/usb/ugen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ugen.c,v 1.30 2004/07/21 00:01:07 dlg Exp $ */
+/* $OpenBSD: ugen.c,v 1.31 2004/10/31 12:10:52 dlg Exp $ */
/* $NetBSD: ugen.c,v 1.63 2002/11/26 18:49:48 christos Exp $ */
/* $FreeBSD: src/sys/dev/usb/ugen.c,v 1.26 1999/11/17 22:33:41 n_hibma Exp $ */
@@ -1227,12 +1227,15 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
return (error);
}
case USB_GET_STRING_DESC:
+ {
+ int len;
si = (struct usb_string_desc *)addr;
err = usbd_get_string_desc(sc->sc_udev, si->usd_string_index,
- si->usd_language_id, &si->usd_desc);
+ si->usd_language_id, &si->usd_desc, &len);
if (err)
return (EINVAL);
break;
+ }
case USB_DO_REQUEST:
{
struct usb_ctl_request *ur = (void *)addr;