summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vitalii Tomkiv <vitalit@google.com> 2016-10-21 14:03:48 -0700
committer Vitalii Tomkiv <vitalit@google.com> 2016-10-25 15:58:05 -0700
commitd9804ef16072f3d1ea10fc14b1459f7306c2a1b0 (patch)
treeefc7947cfe0067afcb9c6329e0635e4aa68e17d1
parent0f7cc4dc2c49a30c072cbc7aa6c0c5d5c31496d4 (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.cpp5
-rw-r--r--services/core/jni/com_android_server_UsbHostManager.cpp17
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,