diff options
author | Wei Jia <wjia@google.com> | 2014-12-05 16:25:54 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-12-05 16:25:54 +0000 |
commit | 9d02ca1a4e02ecc65edbe1deaaf06e65d33e9a28 (patch) | |
tree | 054375dd16d6b0d0c481901a329b9d5e70e707a2 /media/libstagefright/mpeg2ts/ESQueue.cpp | |
parent | bfe1f3605c532ff2681458fe635beb8c47289205 (diff) | |
parent | 4d82c2f0d0361cd0062c3454d557bb1064e92020 (diff) | |
download | frameworks_av-9d02ca1a4e02ecc65edbe1deaaf06e65d33e9a28.zip frameworks_av-9d02ca1a4e02ecc65edbe1deaaf06e65d33e9a28.tar.gz frameworks_av-9d02ca1a4e02ecc65edbe1deaaf06e65d33e9a28.tar.bz2 |
am 4d82c2f0: am 848b4c67: am 814cbb4e: Merge "ESQueue: add frame length checking in validation of ADTS header." into lmp-mr1-dev
* commit '4d82c2f0d0361cd0062c3454d557bb1064e92020':
ESQueue: add frame length checking in validation of ADTS header.
Diffstat (limited to 'media/libstagefright/mpeg2ts/ESQueue.cpp')
-rw-r--r-- | media/libstagefright/mpeg2ts/ESQueue.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp index b01b0c0..43f1347 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.cpp +++ b/media/libstagefright/mpeg2ts/ESQueue.cpp @@ -170,8 +170,9 @@ static bool IsSeeminglyValidAC3Header(const uint8_t *ptr, size_t size) { return parseAC3SyncFrame(ptr, size, NULL) > 0; } -static bool IsSeeminglyValidADTSHeader(const uint8_t *ptr, size_t size) { - if (size < 3) { +static bool IsSeeminglyValidADTSHeader( + const uint8_t *ptr, size_t size, size_t *frameLength) { + if (size < 7) { // Not enough data to verify header. return false; } @@ -194,6 +195,13 @@ static bool IsSeeminglyValidADTSHeader(const uint8_t *ptr, size_t size) { return false; } + size_t frameLengthInHeader = + ((ptr[3] & 3) << 11) + (ptr[4] << 3) + ((ptr[5] >> 5) & 7); + if (frameLengthInHeader > size) { + return false; + } + + *frameLength = frameLengthInHeader; return true; } @@ -315,8 +323,10 @@ status_t ElementaryStreamQueue::appendData( } #else ssize_t startOffset = -1; + size_t frameLength; for (size_t i = 0; i < size; ++i) { - if (IsSeeminglyValidADTSHeader(&ptr[i], size - i)) { + if (IsSeeminglyValidADTSHeader( + &ptr[i], size - i, &frameLength)) { startOffset = i; break; } @@ -332,8 +342,13 @@ status_t ElementaryStreamQueue::appendData( startOffset); } + if (frameLength != size - startOffset) { + ALOGW("got ADTS AAC frame length %zd instead of %zd", + frameLength, size - startOffset); + } + data = &ptr[startOffset]; - size -= startOffset; + size = frameLength; #endif break; } |