summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2011-10-07 14:17:09 -0700
committerJeff Brown <jeffbrown@google.com>2011-10-07 14:17:09 -0700
commit715311fa5aeb39fd0904209e1428a3656c721c3d (patch)
tree28b832569d29e160bb883772c5ab6bbb9589d884 /core/jni
parent7ce745248d4de0e6543a559c93423df899832100 (diff)
downloadframeworks_base-715311fa5aeb39fd0904209e1428a3656c721c3d.zip
frameworks_base-715311fa5aeb39fd0904209e1428a3656c721c3d.tar.gz
frameworks_base-715311fa5aeb39fd0904209e1428a3656c721c3d.tar.bz2
Fix regression in CursorWindow.getString()
Bug: 5332296 NewStringUTF expects modified UTF-8, so it barfs on UTF-8 strings that contain high codepoints. Even though it results in an extra copy being performed, first convert to UTF-16, then call NewString. Change-Id: Idbfeb3cc2c4b731834e4482848dcac2fa33ec2d0
Diffstat (limited to 'core/jni')
-rw-r--r--core/jni/android_database_CursorWindow.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp
index 7f5c0d4..fe1aca0 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -205,8 +205,14 @@ static jstring nativeGetString(JNIEnv* env, jclass clazz, jint windowPtr,
if (type == FIELD_TYPE_STRING) {
uint32_t size = fieldSlot->data.buffer.size;
#if WINDOW_STORAGE_UTF8
- return size > 1 ? env->NewStringUTF(window->getFieldSlotValueString(fieldSlot))
- : gEmptyString;
+ if (size <= 1) {
+ return gEmptyString;
+ }
+ // Convert to UTF-16 here instead of calling NewStringUTF. NewStringUTF
+ // doesn't like UTF-8 strings with high codepoints. It actually expects
+ // Modified UTF-8 with encoded surrogate pairs.
+ String16 utf16(window->getFieldSlotValueString(fieldSlot), size - 1);
+ return env->NewString(reinterpret_cast<const jchar*>(utf16.string()), utf16.size());
#else
size_t chars = size / sizeof(char16_t);
return chars ? env->NewString(reinterpret_cast<jchar*>(