diff options
author | Marco Nelissen <marcone@google.com> | 2012-12-19 11:42:55 -0800 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2012-12-19 14:59:12 -0800 |
commit | cbbea8e651feb580f439e28359d72589709fb120 (patch) | |
tree | 4542ceda62be10a91b47e5e691472eeddb947b47 /media/jni/android_media_MediaCodec.cpp | |
parent | 412fbe7f8fb0fc2892308faf52c31dcc01e1cf5a (diff) | |
download | frameworks_base-cbbea8e651feb580f439e28359d72589709fb120.zip frameworks_base-cbbea8e651feb580f439e28359d72589709fb120.tar.gz frameworks_base-cbbea8e651feb580f439e28359d72589709fb120.tar.bz2 |
Don't create weird ByteBuffers
Ensure that we don't create ByteBuffers with a NULL memory pointer
but nonzero size.
b/7892060
Change-Id: I2fc52e19fd05e698c38d94275e738e23a2999e1f
Diffstat (limited to 'media/jni/android_media_MediaCodec.cpp')
-rw-r--r-- | media/jni/android_media_MediaCodec.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index dab2de1..54cd71d 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -237,15 +237,27 @@ status_t JMediaCodec::getBuffers( *bufArray = (jobjectArray)env->NewObjectArray( buffers.size(), byteBufferClass, NULL); + if (*bufArray == NULL) { + env->DeleteLocalRef(nativeByteOrderObj); + return NO_MEMORY; + } for (size_t i = 0; i < buffers.size(); ++i) { const sp<ABuffer> &buffer = buffers.itemAt(i); + // if this is an ABuffer that doesn't actually hold any accessible memory, + // use a null ByteBuffer + if (buffer->base() == NULL) { + continue; + } jobject byteBuffer = env->NewDirectByteBuffer( buffer->base(), buffer->capacity()); - + if (byteBuffer == NULL) { + env->DeleteLocalRef(nativeByteOrderObj); + return NO_MEMORY; + } jobject me = env->CallObjectMethod( byteBuffer, orderID, nativeByteOrderObj); env->DeleteLocalRef(me); @@ -715,7 +727,10 @@ static jobjectArray android_media_MediaCodec_getBuffers( return buffers; } - throwExceptionAsNecessary(env, err); + // if we're out of memory, an exception was already thrown + if (err != NO_MEMORY) { + throwExceptionAsNecessary(env, err); + } return NULL; } |