diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp index b72a8cc8bd..aea28c0386 100755 --- a/media/extractors/mp4/MPEG4Extractor.cpp +++ b/media/extractors/mp4/MPEG4Extractor.cpp @@ -2896,7 +2896,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { return ERROR_MALFORMED; } - parseID3v2MetaData(data_offset + 6); + parseID3v2MetaData(data_offset + 6, chunk_data_size - 6); break; } @@ -4167,8 +4167,19 @@ status_t MPEG4Extractor::parse3GPPMetaData(off64_t offset, size_t size, int dept return OK; } -void MPEG4Extractor::parseID3v2MetaData(off64_t offset) { - ID3 id3(mDataSource, true /* ignorev1 */, offset); +void MPEG4Extractor::parseID3v2MetaData(off64_t offset, uint64_t size) { + uint8_t *buffer = new (std::nothrow) uint8_t[size]; + if (buffer == NULL) { + return; + } + if (mDataSource->readAt(offset, buffer, size) != (ssize_t)size) { + delete[] buffer; + buffer = NULL; + return; + } + + ID3 id3(buffer, size, true /* ignorev1 */); + delete[] buffer; if (id3.isValid()) { struct Map { diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h index 3af432dbf6..1e49d504ee 100644 --- a/media/extractors/mp4/MPEG4Extractor.h +++ b/media/extractors/mp4/MPEG4Extractor.h @@ -161,7 +161,7 @@ private: status_t parseITunesMetaData(off64_t offset, size_t size); status_t parseColorInfo(off64_t offset, size_t size); status_t parse3GPPMetaData(off64_t offset, size_t size, int depth); - void parseID3v2MetaData(off64_t offset); + void parseID3v2MetaData(off64_t offset, uint64_t size); status_t parseQTMetaKey(off64_t data_offset, size_t data_size); status_t parseQTMetaVal(int32_t keyId, off64_t data_offset, size_t data_size);