Hi, Notice the code the get_string has changed: https://github.com/walac/pyusb/blob/master/usb/util.py#L295-L340
2015-08-08 1:14 GMT-03:00 Paul Cornelius <paul.cornel...@vuemetrix.com>: > I found a bug in usb.util.py in the function get_string. This function was > failing with an "Overflow" error on my Windows 8.1 machine, using Python 3.3 > and libusb-1.0. > > If this function is called with the default value for langid (None), it > first makes a call to get_descriptor to obtain a list of languages supported > by the device. This second parameter of this function call is the size of > the reply buffer, which was equal to 1024. But a comment in the libusb-1.0 > source (descriptor.c, function libusb_get_string_descriptor_ascii) reads: /* > Some devices choke on size > 255 */. > > And it seems to be true. When I changed the get_descriptor function call to > reduce the buffer size parameter to 255 the error disappeared. I also > thought it would be good to limit the size of any buffer passed to > get_string. My modified function now reads as follows: > > def get_string(dev, length, index, langid = None): > r"""Retrieve a string descriptor from the device. > > dev is the Device object to which the request will be > sent to. > > length is the length of string in number of characters. > > index is the string descriptor index and langid is the Language > ID of the descriptor. If langid is omitted, the string descriptor > of the first Language ID will be returned. > > The return value is the unicode string present in the descriptor. > """ > from usb.control import get_descriptor > if langid is None: > # Asking for the zero'th index is special - it returns a string > # descriptor that contains all the language IDs supported by the device. > # Typically there aren't many - often only one. The language IDs are 16 > # bit numbers, and they start at the third byte in the descriptor. See > # USB 2.0 specification section 9.6.7 for more information. > # > # Note from libusb 1.0 sources (descriptor.c) > buf = get_descriptor( > dev, > 255, > DESC_TYPE_STRING, > 0 > ) > assert len(buf) >= 4 > langid = buf[2] | (buf[3] << 8) > > lenstr = length * 2 + 2 > if lenstr > 255: > raise ValueError("String buffer length too long") > buf = get_descriptor( > dev, > length * 2 + 2, # string is utf16 + 2 bytes of the > descriptor > DESC_TYPE_STRING, > index, > langid > ) > return buf[2:].tostring().decode('utf-16-le') > > Paul Cornelius > > ------------------------------------------------------------------------------ > > _______________________________________________ > pyusb-users mailing list > pyusb-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/pyusb-users > -- Best Regards, Wander Lairson Costa ------------------------------------------------------------------------------ _______________________________________________ pyusb-users mailing list pyusb-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/pyusb-users