Skip to content

Commit 29a056f

Browse files
Wonsik Kimandi34
authored andcommitted
DO NOT MERGE codecs: check OMX buffer size before use in (h263|h264)dec
Bug: 27833616 Change-Id: I0fd599b3da431425d89236ffdd9df423c11947c0
1 parent 23927df commit 29a056f

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,14 @@ void SoftMPEG4::onQueueFilled(OMX_U32 portIndex) {
209209
int32_t bufferSize = inHeader->nFilledLen;
210210
int32_t tmp = bufferSize;
211211

212+
OMX_U32 frameSize = (mWidth * mHeight * 3) / 2;
213+
if (outHeader->nAllocLen < frameSize) {
214+
android_errorWriteLog(0x534e4554, "27833616");
215+
ALOGE("Insufficient output buffer size");
216+
notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
217+
mSignalledError = true;
218+
return;
219+
}
212220
// The PV decoder is lying to us, sometimes it'll claim to only have
213221
// consumed a subset of the buffer when it clearly consumed all of it.
214222
// ignore whatever it says...
@@ -250,7 +258,7 @@ void SoftMPEG4::onQueueFilled(OMX_U32 portIndex) {
250258
++mInputBufferCount;
251259

252260
outHeader->nOffset = 0;
253-
outHeader->nFilledLen = (mWidth * mHeight * 3) / 2;
261+
outHeader->nFilledLen = frameSize;
254262

255263
List<BufferInfo *>::iterator it = outQueue.begin();
256264
while ((*it)->mHeader != outHeader) {

media/libstagefright/codecs/on2/h264dec/SoftAVC.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,12 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) {
205205
}
206206

207207
if (mFirstPicture && !outQueue.empty()) {
208-
drainOneOutputBuffer(mFirstPictureId, mFirstPicture);
208+
if (!drainOneOutputBuffer(mFirstPictureId, mFirstPicture)) {
209+
ALOGE("Drain failed");
210+
notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
211+
mSignalledError = true;
212+
return;
213+
}
209214
delete[] mFirstPicture;
210215
mFirstPicture = NULL;
211216
mFirstPictureId = -1;
@@ -255,11 +260,15 @@ void SoftAVC::saveFirstOutputBuffer(int32_t picId, uint8_t *data) {
255260
memcpy(mFirstPicture, data, mPictureSize);
256261
}
257262

258-
void SoftAVC::drainOneOutputBuffer(int32_t picId, uint8_t* data) {
263+
bool SoftAVC::drainOneOutputBuffer(int32_t picId, uint8_t* data) {
259264
List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex);
260265
BufferInfo *outInfo = *outQueue.begin();
261-
outQueue.erase(outQueue.begin());
262266
OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader;
267+
if (outHeader->nAllocLen - outHeader->nOffset < mPictureSize) {
268+
android_errorWriteLog(0x534e4554, "27833616");
269+
return false;
270+
}
271+
outQueue.erase(outQueue.begin());
263272
OMX_BUFFERHEADERTYPE *header = mPicToHeaderMap.valueFor(picId);
264273
outHeader->nTimeStamp = header->nTimeStamp;
265274
outHeader->nFlags = header->nFlags;
@@ -270,6 +279,7 @@ void SoftAVC::drainOneOutputBuffer(int32_t picId, uint8_t* data) {
270279
delete header;
271280
outInfo->mOwnedByUs = false;
272281
notifyFillBufferDone(outHeader);
282+
return true;
273283
}
274284

275285
void SoftAVC::drainAllOutputBuffers(bool eos) {
@@ -282,7 +292,12 @@ void SoftAVC::drainAllOutputBuffers(bool eos) {
282292
mHandle, &decodedPicture, eos /* flush */)) {
283293
int32_t picId = decodedPicture.picId;
284294
uint8_t *data = (uint8_t *) decodedPicture.pOutputPicture;
285-
drainOneOutputBuffer(picId, data);
295+
if (!drainOneOutputBuffer(picId, data)) {
296+
ALOGE("Drain failed");
297+
notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
298+
mSignalledError = true;
299+
return;
300+
}
286301
}
287302
}
288303

media/libstagefright/codecs/on2/h264dec/SoftAVC.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ struct SoftAVC : public SoftVideoDecoderOMXComponent {
7373

7474
status_t initDecoder();
7575
void drainAllOutputBuffers(bool eos);
76-
void drainOneOutputBuffer(int32_t picId, uint8_t *data);
76+
bool drainOneOutputBuffer(int32_t picId, uint8_t *data);
7777
void saveFirstOutputBuffer(int32_t pidId, uint8_t *data);
7878
bool handleCropRectEvent(const CropParams* crop);
7979
bool handlePortSettingChangeEvent(const H264SwDecInfo *info);

0 commit comments

Comments
 (0)