summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@google.com>2014-09-08 16:15:21 -0700
committerMichael Wright <michaelwr@google.com>2014-09-08 17:05:44 -0700
commit9ee5e7e17f7d65620f21d1a42865981e7bc56593 (patch)
tree9e65103e7fc4429505ba2cd8c4a2ce84bddd39cb
parent3afd6e3fc612e12ad55de53747641f63f457bb42 (diff)
downloadframeworks_base-9ee5e7e17f7d65620f21d1a42865981e7bc56593.zip
frameworks_base-9ee5e7e17f7d65620f21d1a42865981e7bc56593.tar.gz
frameworks_base-9ee5e7e17f7d65620f21d1a42865981e7bc56593.tar.bz2
USB string descriptors are not UTF8, so it is not safe to treat them as such.
Add AndroidRuntime::NewStringLatin1() to convert non-UTF8 strings to Java strings. Bug: 17427781 Change-Id: I7df1d4e94a7beebc8b1a74c0c0a163b794025ae8
-rw-r--r--core/jni/AndroidRuntime.cpp14
-rw-r--r--include/android_runtime/AndroidRuntime.h3
-rw-r--r--services/core/jni/com_android_server_UsbHostManager.cpp10
3 files changed, 22 insertions, 5 deletions
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 62d8036..305d1cf 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -925,6 +925,20 @@ char* AndroidRuntime::toSlashClassName(const char* className)
return result;
}
+/** Create a Java string from an ASCII or Latin-1 string */
+jstring AndroidRuntime::NewStringLatin1(JNIEnv* env, const char* bytes) {
+ if (!bytes) return NULL;
+ int length = strlen(bytes);
+ jchar* buffer = (jchar *)alloca(length * sizeof(jchar));
+ if (!buffer) return NULL;
+ jchar* chp = buffer;
+ for (int i = 0; i < length; i++) {
+ *chp++ = *bytes++;
+ }
+ return env->NewString(buffer, length);
+}
+
+
/*
* Start the Android runtime. This involves starting the virtual machine
* and calling the "static void main(String[] args)" method in the class
diff --git a/include/android_runtime/AndroidRuntime.h b/include/android_runtime/AndroidRuntime.h
index 51e47e6..a882870 100644
--- a/include/android_runtime/AndroidRuntime.h
+++ b/include/android_runtime/AndroidRuntime.h
@@ -114,6 +114,9 @@ public:
/** return a new string corresponding to 'className' with all '.'s replaced by '/'s. */
static char* toSlashClassName(const char* className);
+ /** Create a Java string from an ASCII or Latin-1 string */
+ static jstring NewStringLatin1(JNIEnv* env, const char* bytes);
+
private:
static int startReg(JNIEnv* env);
void addOption(const char* optionString, void* extra_info = NULL);
diff --git a/services/core/jni/com_android_server_UsbHostManager.cpp b/services/core/jni/com_android_server_UsbHostManager.cpp
index bc866d3..b051a12 100644
--- a/services/core/jni/com_android_server_UsbHostManager.cpp
+++ b/services/core/jni/com_android_server_UsbHostManager.cpp
@@ -77,9 +77,9 @@ static int usb_device_added(const char *devname, void* client_data) {
char *serial = usb_device_get_serial(device);
jstring deviceName = env->NewStringUTF(devname);
- jstring manufacturerName = env->NewStringUTF(manufacturer);
- jstring productName = env->NewStringUTF(product);
- jstring serialNumber = env->NewStringUTF(serial);
+ jstring manufacturerName = AndroidRuntime::NewStringLatin1(env, manufacturer);
+ jstring productName = AndroidRuntime::NewStringLatin1(env, product);
+ jstring serialNumber = AndroidRuntime::NewStringLatin1(env, serial);
jboolean result = env->CallBooleanMethod(thiz, method_beginUsbDeviceAdded,
deviceName, usb_device_get_vendor_id(device), usb_device_get_product_id(device),
@@ -102,7 +102,7 @@ static int usb_device_added(const char *devname, void* client_data) {
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);
- jstring configName = env->NewStringUTF(name);
+ jstring configName = AndroidRuntime::NewStringLatin1(env, name);
env->CallVoidMethod(thiz, method_addUsbConfiguration,
config->bConfigurationValue, configName, config->bmAttributes,
@@ -113,7 +113,7 @@ static int usb_device_added(const char *devname, void* client_data) {
} 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);
- jstring interfaceName = env->NewStringUTF(name);
+ jstring interfaceName = AndroidRuntime::NewStringLatin1(env, name);
env->CallVoidMethod(thiz, method_addUsbInterface,
interface->bInterfaceNumber, interfaceName, interface->bAlternateSetting,