diff options
author | Marco Nelissen <marcone@google.com> | 2013-02-12 11:16:17 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-02-12 11:16:17 -0800 |
commit | 145716e7c15867b13f518e49d3611a5f8030e7ee (patch) | |
tree | 02a902bbabba1cfc877b1b2802d72c674ef776fe /media/jni | |
parent | 28b05169c0a3ddbe2fb59001c25410dfe724ce55 (diff) | |
parent | 789e3fa052747feb72e8ffdc778d5bc19a718c06 (diff) | |
download | frameworks_base-145716e7c15867b13f518e49d3611a5f8030e7ee.zip frameworks_base-145716e7c15867b13f518e49d3611a5f8030e7ee.tar.gz frameworks_base-145716e7c15867b13f518e49d3611a5f8030e7ee.tar.bz2 |
am 789e3fa0: am 9f03d4f9: Merge "Revert "use utf8_length() instead of local function, isValidUtf8()""
# Via Gerrit Code Review (2) and Android Git Automerger (1)
* commit '789e3fa052747feb72e8ffdc778d5bc19a718c06':
Revert "use utf8_length() instead of local function, isValidUtf8()"
Diffstat (limited to 'media/jni')
-rw-r--r-- | media/jni/android_media_MediaScanner.cpp | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp index f930a03..5d27966 100644 --- a/media/jni/android_media_MediaScanner.cpp +++ b/media/jni/android_media_MediaScanner.cpp @@ -19,7 +19,6 @@ #define LOG_TAG "MediaScannerJNI" #include <utils/Log.h> #include <utils/threads.h> -#include <utils/Unicode.h> #include <media/mediascanner.h> #include <media/stagefright/StagefrightMediaScanner.h> @@ -57,6 +56,53 @@ static status_t checkAndClearExceptionFromCallback(JNIEnv* env, const char* meth return OK; } +// stolen from dalvik/vm/checkJni.cpp +static bool isValidUtf8(const char* bytes) { + while (*bytes != '\0') { + unsigned char utf8 = *(bytes++); + // Switch on the high four bits. + switch (utf8 >> 4) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + // Bit pattern 0xxx. No need for any extra bytes. + break; + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0f: + /* + * Bit pattern 10xx or 1111, which are illegal start bytes. + * Note: 1111 is valid for normal UTF-8, but not the + * modified UTF-8 used here. + */ + return false; + case 0x0e: + // Bit pattern 1110, so there are two additional bytes. + utf8 = *(bytes++); + if ((utf8 & 0xc0) != 0x80) { + return false; + } + // Fall through to take care of the final byte. + case 0x0c: + case 0x0d: + // Bit pattern 110x, so there is one additional byte. + utf8 = *(bytes++); + if ((utf8 & 0xc0) != 0x80) { + return false; + } + break; + } + } + return true; +} + class MyMediaScannerClient : public MediaScannerClient { public: @@ -124,11 +170,8 @@ public: mEnv->ExceptionClear(); return NO_MEMORY; } - - // Check if the value is valid UTF-8 string and replace - // any un-printable characters with '?' when it's not. char *cleaned = NULL; - if (utf8_length(value) == -1) { + if (!isValidUtf8(value)) { cleaned = strdup(value); char *chp = cleaned; char ch; |