From 20568917af6d2a6c569d7f0f0155e80c3bcd1b78 Mon Sep 17 00:00:00 2001 From: Paul McLean Date: Tue, 11 Jul 2017 11:18:59 -0600 Subject: More fine-grained exception handling so we can still use non-excepting descriptors. Bug: 63655391 Test: Manual - connect various devices and verify the connection state is correct. Change-Id: Iae6143d2e853e916c8588e0c6f771c00714b3a8a --- .../usb/descriptors/UsbDescriptorParser.java | 41 ++++++++++++---------- 1 file changed, 23 insertions(+), 18 deletions(-) (limited to 'services/usb/java') diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java index 7c074dadadf9..303a577767ad 100644 --- a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java +++ b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java @@ -118,27 +118,28 @@ public class UsbDescriptorParser { /** * @hide */ - public boolean parseDescriptors(byte[] descriptors) { - try { - mDescriptors.clear(); - - ByteStream stream = new ByteStream(descriptors); - while (stream.available() > 0) { - UsbDescriptor descriptor = allocDescriptor(stream); - if (descriptor != null) { - // Parse + public void parseDescriptors(byte[] descriptors) { + mDescriptors.clear(); + + ByteStream stream = new ByteStream(descriptors); + while (stream.available() > 0) { + UsbDescriptor descriptor = allocDescriptor(stream); + if (descriptor != null) { + // Parse + try { descriptor.parseRawDescriptors(stream); - mDescriptors.add(descriptor); - - // Clean up - descriptor.postParse(stream); + } catch (Exception ex) { + Log.e(TAG, "Exception parsing USB descriptors.", ex); } + + // Its OK to add the invalid descriptor as the postParse() + // routine will mark it as invalid. + mDescriptors.add(descriptor); + + // Clean up + descriptor.postParse(stream); } - return true; - } catch (Exception ex) { - Log.e(TAG, "Exception parsing USB descriptors.", ex); } - return false; } /** @@ -146,7 +147,11 @@ public class UsbDescriptorParser { */ public boolean parseDevice(String deviceAddr) { byte[] rawDescriptors = getRawDescriptors(deviceAddr); - return rawDescriptors != null && parseDescriptors(rawDescriptors); + if (rawDescriptors != null) { + parseDescriptors(rawDescriptors); + return true; + } + return false; } private native byte[] getRawDescriptors(String deviceAddr); -- cgit v1.2.3-59-g8ed1b