summaryrefslogtreecommitdiffstats
path: root/media/jni
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2013-02-12 11:16:17 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2013-02-12 11:16:17 -0800
commit145716e7c15867b13f518e49d3611a5f8030e7ee (patch)
tree02a902bbabba1cfc877b1b2802d72c674ef776fe /media/jni
parent28b05169c0a3ddbe2fb59001c25410dfe724ce55 (diff)
parent789e3fa052747feb72e8ffdc778d5bc19a718c06 (diff)
downloadframeworks_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.cpp53
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;