diff options
| author | 2016-10-21 14:03:48 -0700 | |
|---|---|---|
| committer | 2016-10-25 15:58:05 -0700 | |
| commit | d9804ef16072f3d1ea10fc14b1459f7306c2a1b0 (patch) | |
| tree | efc7947cfe0067afcb9c6329e0635e4aa68e17d1 | |
| parent | 0f7cc4dc2c49a30c072cbc7aa6c0c5d5c31496d4 (diff) | |
Add timeout to usb_device_get_string to prevent usb stuck state for bad
behaving devices.
Bug: 31923641
Test: manual run and test with bad devices.
Change-Id: Ie93b5d33e23de461e1b158215adcf5ccc122f48a
| -rw-r--r-- | core/jni/android_hardware_UsbDeviceConnection.cpp | 5 | ||||
| -rw-r--r-- | services/core/jni/com_android_server_UsbHostManager.cpp | 17 |
2 files changed, 16 insertions, 6 deletions
diff --git a/core/jni/android_hardware_UsbDeviceConnection.cpp b/core/jni/android_hardware_UsbDeviceConnection.cpp index 7ec17bf1d85e..9ceb25a3dfdf 100644 --- a/core/jni/android_hardware_UsbDeviceConnection.cpp +++ b/core/jni/android_hardware_UsbDeviceConnection.cpp @@ -31,6 +31,8 @@ using namespace android; +static const int USB_CONTROL_READ_TIMEOUT_MS = 200; + static jfieldID field_context; struct usb_device* get_device_from_object(JNIEnv* env, jobject connection) @@ -238,7 +240,8 @@ android_hardware_UsbDeviceConnection_get_serial(JNIEnv *env, jobject thiz) ALOGE("device is closed in native_get_serial"); return NULL; } - char* serial = usb_device_get_serial(device); + char* serial = usb_device_get_serial(device, + USB_CONTROL_READ_TIMEOUT_MS); if (!serial) return NULL; jstring result = env->NewStringUTF(serial); diff --git a/services/core/jni/com_android_server_UsbHostManager.cpp b/services/core/jni/com_android_server_UsbHostManager.cpp index 795f6aa6018a..a2b79ffe30c3 100644 --- a/services/core/jni/com_android_server_UsbHostManager.cpp +++ b/services/core/jni/com_android_server_UsbHostManager.cpp @@ -34,6 +34,8 @@ namespace android { +static const int USB_CONTROL_TRANSFER_TIMEOUT_MS = 200; + static struct parcel_file_descriptor_offsets_t { jclass mClass; @@ -69,10 +71,13 @@ static int usb_device_added(const char *devname, void* client_data) { jobject thiz = (jobject)client_data; const usb_device_descriptor* deviceDesc = usb_device_get_device_descriptor(device); - char *manufacturer = usb_device_get_manufacturer_name(device); - char *product = usb_device_get_product_name(device); + char *manufacturer = usb_device_get_manufacturer_name(device, + USB_CONTROL_TRANSFER_TIMEOUT_MS); + char *product = usb_device_get_product_name(device, + USB_CONTROL_TRANSFER_TIMEOUT_MS); int version = usb_device_get_version(device); - char *serial = usb_device_get_serial(device); + char *serial = usb_device_get_serial(device, + USB_CONTROL_TRANSFER_TIMEOUT_MS); jstring deviceName = env->NewStringUTF(devname); jstring manufacturerName = AndroidRuntime::NewStringLatin1(env, manufacturer); @@ -99,7 +104,8 @@ static int usb_device_added(const char *devname, void* client_data) { while ((desc = usb_descriptor_iter_next(&iter)) != NULL) { if (desc->bDescriptorType == USB_DT_CONFIG) { struct usb_config_descriptor *config = (struct usb_config_descriptor *)desc; - char *name = usb_device_get_string(device, config->iConfiguration); + char *name = usb_device_get_string(device, config->iConfiguration, + USB_CONTROL_TRANSFER_TIMEOUT_MS); jstring configName = AndroidRuntime::NewStringLatin1(env, name); env->CallVoidMethod(thiz, method_addUsbConfiguration, @@ -110,7 +116,8 @@ static int usb_device_added(const char *devname, void* client_data) { free(name); } else if (desc->bDescriptorType == USB_DT_INTERFACE) { struct usb_interface_descriptor *interface = (struct usb_interface_descriptor *)desc; - char *name = usb_device_get_string(device, interface->iInterface); + char *name = usb_device_get_string(device, interface->iInterface, + USB_CONTROL_TRANSFER_TIMEOUT_MS); jstring interfaceName = AndroidRuntime::NewStringLatin1(env, name); env->CallVoidMethod(thiz, method_addUsbInterface, |