summaryrefslogtreecommitdiffstats
path: root/media/jni/android_media_MediaCodec.cpp
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2012-12-19 11:42:55 -0800
committerMarco Nelissen <marcone@google.com>2012-12-19 14:59:12 -0800
commitcbbea8e651feb580f439e28359d72589709fb120 (patch)
tree4542ceda62be10a91b47e5e691472eeddb947b47 /media/jni/android_media_MediaCodec.cpp
parent412fbe7f8fb0fc2892308faf52c31dcc01e1cf5a (diff)
downloadframeworks_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.cpp19
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;
}