From cbbea8e651feb580f439e28359d72589709fb120 Mon Sep 17 00:00:00 2001 From: Marco Nelissen Date: Wed, 19 Dec 2012 11:42:55 -0800 Subject: [PATCH] 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 --- media/jni/android_media_MediaCodec.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index dab2de1b6b9e5..54cd71da03663 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 &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; }