diff options
author | Deva Ramasubramanian <dramasub@codeaurora.org> | 2011-07-15 17:32:33 -0700 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2011-11-13 19:38:49 -0800 |
commit | 49cf37f00e16bf4bccf2877fbd3050e266ccd468 (patch) | |
tree | ea0f2ee5b2a4f9780dd3d1cfc8519f7562b30f9f /media | |
parent | 91101bd5d7b3be0131e5f1a288992fee9fd1db2b (diff) | |
download | frameworks_base-49cf37f00e16bf4bccf2877fbd3050e266ccd468.zip frameworks_base-49cf37f00e16bf4bccf2877fbd3050e266ccd468.tar.gz frameworks_base-49cf37f00e16bf4bccf2877fbd3050e266ccd468.tar.bz2 |
libstagefright: Fix for handling empty buffers from extractors
There is a possiblity that mSource->read will return a NULL buffer with
a invalid size. As some implementations of memcpy don't handle NULL
buffers well, it's best to check for a NULL buffer and avoid the memcpy.
This fix also handles the case where the buffer happens to be NULL but
size happens to be wrongly set.
(cherry picked from commit b05336ce6a579a2a4912177b0606d25430382abf)
Change-Id: Ic48ba92c7bc73afefc3b63e5cf00cb96ee384175
Conflicts:
media/libstagefright/OMXCodec.cpp
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 1da93a6..8fc92eb 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -4067,13 +4067,14 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { } size_t remainingBytes = info->mSize - offset; + size_t srcBufferLength = srcBuffer->range_length(); - if (srcBuffer->range_length() > remainingBytes) { + if (srcBufferLength > remainingBytes) { if (offset == 0) { CODEC_LOGE( "Codec's input buffers are too small to accomodate " "buffer read from source (info->mSize = %d, srcLength = %d)", - info->mSize, srcBuffer->range_length()); + info->mSize, srcBufferLength); srcBuffer->release(); srcBuffer = NULL; @@ -4118,9 +4119,16 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { tmpBuffer->release(); } #else - memcpy((uint8_t *)info->mData + offset, - (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(), - srcBuffer->range_length()); + if (srcBuffer->data()) { + memcpy((uint8_t *)info->mData + offset, + (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(), + srcBufferLength); + } else { + if (srcBufferLength != 0) { + LOGW("Source buffer was NULL but the size wasn't 0 bytes (is %d bytes)", srcBufferLength); + srcBufferLength = 0; + } + } #endif } @@ -4132,7 +4140,7 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { timestampUs = lastBufferTimeUs; } - offset += srcBuffer->range_length(); + offset += srcBufferLength; if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) { info->mMediaBuffer = srcBuffer; |