Skip to content

Overflow while getting descriptors #3

@ecki

Description

@ecki

While running usb4java-javax-example DumpNames I get an overflow error while reading manufacturer and product name.

The problems happens in LibUsb.getDescriptor() called by AbstractDevice#getLanguages(), but when I ignore this overflow (using language 0) a similiar error happens on AbstractDevice#getUsbStringDescriptor().

I tried to increase the ByteBuffer allocation, but this does not help.

C:\ws\github\usb4java-javax-examples>java -cp target\usb4java-javax-examples-1.0.0-SNAPSHOT.jar;c:\users\eckenfel\.m2\repository\org\usb4java\libusb4java\1.2.0\libusb4java-1.2.0-windows-x86_64.jar;c:\Users\eckenfel\.m2\repository\org\usb4java\usb4java-javax\1.2.1-SNAPSHOT\usb4java-javax-1.2.1-SNAPSHOT.jar;c:\users\eckenfel\.m2\repository\javax\usb\usb-api\1.0.2\usb-api-1.0.2.jar;C:\users\eckenfel\.m2\repository\org\usb4java\usb4java\1.2.0\usb4java-1.2.0.jar;C:\users\eckenfel\.m2\repository\org\apache\commons\commons-lang3\3.1\commons-lang3-3.1.jar org.usb4java.javax.examples.DumpNames
USB Service Implementation: usb4java
Implementation version: 1.2.0
Service API version: 1.0.2

Ignoring problematic device: Bus 001 Device 005: ID 1050:0120
javax.usb.UsbPlatformException: USB error 8: Unable to get string descriptor languages: Overflow
    at org.usb4java.javax.ExceptionUtils.createPlatformException(ExceptionUtils.java:39)
    at org.usb4java.javax.AbstractDevice.getLanguages(AbstractDevice.java:544)
    at org.usb4java.javax.AbstractDevice.getUsbStringDescriptor(AbstractDevice.java:507)
    at org.usb4java.javax.AbstractDevice.getString(AbstractDevice.java:526)
    at org.usb4java.javax.examples.DumpNames.dumpName(DumpNames.java:53)
    at org.usb4java.javax.examples.DumpNames.processDevice(DumpNames.java:87)
    at org.usb4java.javax.examples.DumpNames.processDevice(DumpNames.java:75)
    at org.usb4java.javax.examples.DumpNames.processDevice(DumpNames.java:75)
    at org.usb4java.javax.examples.DumpNames.main(DumpNames.java:122)

I can work around this with ignoring the Overflow:

if (result == LibUsb.ERROR_OVERFLOW) return new short[0];

Ignoring problematic device: Bus 001 Device 005: ID 1050:0120
javax.usb.UsbPlatformException: USB error 8: Unable to get string descriptor 1 from device Bus 001 Device 005: ID 1050:0120: Overflow
    at org.usb4java.javax.ExceptionUtils.createPlatformException(ExceptionUtils.java:39)
    at org.usb4java.javax.AbstractDevice.getUsbStringDescriptor(AbstractDevice.java:515)
    at org.usb4java.javax.AbstractDevice.getString(AbstractDevice.java:526)
    at org.usb4java.javax.examples.DumpNames.dumpName(DumpNames.java:53)
    at org.usb4java.javax.examples.DumpNames.processDevice(DumpNames.java:87)
    at org.usb4java.javax.examples.DumpNames.processDevice(DumpNames.java:75)
    at org.usb4java.javax.examples.DumpNames.processDevice(DumpNames.java:75)
    at org.usb4java.javax.examples.DumpNames.main(DumpNames.java:122)

NB: using DumpDevices if usb4java-examples works with the device (it is using getStringDescriptorAscii). It looks like:

Device 001/005
Connected to port: 2
Parent: 001/002
Speed: Full
Device Descriptor:
  bLength                 18
  bDescriptorType          1
  bcdUSB                2.00
  bDeviceClass             0 Per Interface
  bDeviceSubClass          0
  bDeviceProtocol          0
  bMaxPacketSize0         64
  idVendor            0x1050
  idProduct           0x0120
  bcdDevice             3.32
  iManufacturer            1 Yubico
  iProduct                 2 Security Key by Yubico
  iSerial                  0
  bNumConfigurations       1
...

This is on Win7 (german, 64bit) with the Yubico security-key (HID) and 64bit Java7U72.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions