diff options
| author | Daniel Broms <daniel.broms@sonymobile.com> | 2014-09-29 15:32:03 +0200 |
|---|---|---|
| committer | Henrik Baard <henrik.baard@sonymobile.com> | 2014-11-24 07:31:31 +0100 |
| commit | 35d6a4f75bc3e02e5983fb800bc7538d51d01a45 (patch) | |
| tree | 2e5f55f4f68ac3f50d0169649a0bf8a6f3d27f9b /media | |
| parent | a58336f6c8aa44373485e5a6d7ec32677387a935 (diff) | |
| download | frameworks_base-35d6a4f75bc3e02e5983fb800bc7538d51d01a45.zip frameworks_base-35d6a4f75bc3e02e5983fb800bc7538d51d01a45.tar.gz frameworks_base-35d6a4f75bc3e02e5983fb800bc7538d51d01a45.tar.bz2 | |
Handle NULL keys and NULL values in MediaDrm JNI HashMap
If getKeyRequest() of MediaDrm was called with a HashMap containing
NULL keys or NULL values then the mediaserver crashed.
This modification adds NULL checks and throw
IllegalArgumentException as expected.
Change-Id: Ide82efe0f6bd28c8ac3f9aa048d9794f2ccc8fac
Diffstat (limited to 'media')
| -rw-r--r-- | media/jni/android_media_MediaDrm.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index 91eb499..9d2698c 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -438,9 +438,11 @@ static String8 JStringToString8(JNIEnv *env, jstring const &jstr) { Entry e = s.next(); */ -static KeyedVector<String8, String8> HashMapToKeyedVector(JNIEnv *env, jobject &hashMap) { +static KeyedVector<String8, String8> HashMapToKeyedVector( + JNIEnv *env, jobject &hashMap, bool* pIsOK) { jclass clazz = gFields.stringClassId; KeyedVector<String8, String8> keyedVector; + *pIsOK = true; jobject entrySet = env->CallObjectMethod(hashMap, gFields.hashmap.entrySet); if (entrySet) { @@ -451,16 +453,22 @@ static KeyedVector<String8, String8> HashMapToKeyedVector(JNIEnv *env, jobject & jobject entry = env->CallObjectMethod(iterator, gFields.iterator.next); if (entry) { jobject obj = env->CallObjectMethod(entry, gFields.entry.getKey); - if (!env->IsInstanceOf(obj, clazz)) { + if (obj == NULL || !env->IsInstanceOf(obj, clazz)) { jniThrowException(env, "java/lang/IllegalArgumentException", "HashMap key is not a String"); + env->DeleteLocalRef(entry); + *pIsOK = false; + break; } jstring jkey = static_cast<jstring>(obj); obj = env->CallObjectMethod(entry, gFields.entry.getValue); - if (!env->IsInstanceOf(obj, clazz)) { + if (obj == NULL || !env->IsInstanceOf(obj, clazz)) { jniThrowException(env, "java/lang/IllegalArgumentException", "HashMap value is not a String"); + env->DeleteLocalRef(entry); + *pIsOK = false; + break; } jstring jvalue = static_cast<jstring>(obj); @@ -763,7 +771,11 @@ static jobject android_media_MediaDrm_getKeyRequest( KeyedVector<String8, String8> optParams; if (joptParams != NULL) { - optParams = HashMapToKeyedVector(env, joptParams); + bool isOK; + optParams = HashMapToKeyedVector(env, joptParams, &isOK); + if (!isOK) { + return NULL; + } } Vector<uint8_t> request; |
