Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6ba3d7e authored by Pawin Vongmasa's avatar Pawin Vongmasa Committed by Android (Google) Code Review
Browse files

Merge "DO NOT MERGE - MPEG4Extractor: Check mLastTrack before dereferencing." into lmp-dev

parents efe63962 0338b14e
Loading
Loading
Loading
Loading
+62 −0
Original line number Original line Diff line number Diff line
@@ -899,6 +899,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
                    }
                    }
                }
                }


                if (mLastTrack == NULL) {
                    return ERROR_MALFORMED;
                }
                mLastTrack->sampleTable = new SampleTable(mDataSource);
                mLastTrack->sampleTable = new SampleTable(mDataSource);
            }
            }


@@ -996,6 +999,8 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
                ALOGW("ignoring edit list with %d entries", entry_count);
                ALOGW("ignoring edit list with %d entries", entry_count);
            } else if (mHeaderTimescale == 0) {
            } else if (mHeaderTimescale == 0) {
                ALOGW("ignoring edit list because timescale is 0");
                ALOGW("ignoring edit list because timescale is 0");
            } else if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            } else {
            } else {
                off64_t entriesoffset = data_offset + 8;
                off64_t entriesoffset = data_offset + 8;
                uint64_t segment_duration;
                uint64_t segment_duration;
@@ -1048,6 +1053,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('f', 'r', 'm', 'a'):
        case FOURCC('f', 'r', 'm', 'a'):
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }


            uint32_t original_fourcc;
            uint32_t original_fourcc;
            if (mDataSource->readAt(data_offset, &original_fourcc, 4) < 4) {
            if (mDataSource->readAt(data_offset, &original_fourcc, 4) < 4) {
@@ -1068,6 +1076,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('t', 'e', 'n', 'c'):
        case FOURCC('t', 'e', 'n', 'c'):
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }


            if (chunk_size < 32) {
            if (chunk_size < 32) {
                return ERROR_MALFORMED;
                return ERROR_MALFORMED;
@@ -1119,6 +1130,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('t', 'k', 'h', 'd'):
        case FOURCC('t', 'k', 'h', 'd'):
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }


            status_t err;
            status_t err;
            if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) {
            if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) {
@@ -1166,6 +1180,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('m', 'd', 'h', 'd'):
        case FOURCC('m', 'd', 'h', 'd'):
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }


            if (chunk_data_size < 4) {
            if (chunk_data_size < 4) {
                return ERROR_MALFORMED;
                return ERROR_MALFORMED;
@@ -1257,6 +1274,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {


        case FOURCC('s', 't', 's', 'd'):
        case FOURCC('s', 't', 's', 'd'):
        {
        {
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            if (chunk_data_size < 8) {
            if (chunk_data_size < 8) {
                return ERROR_MALFORMED;
                return ERROR_MALFORMED;
            }
            }
@@ -1313,6 +1333,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('s', 'a', 'm', 'r'):
        case FOURCC('s', 'a', 'm', 'r'):
        case FOURCC('s', 'a', 'w', 'b'):
        case FOURCC('s', 'a', 'w', 'b'):
        {
        {
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            uint8_t buffer[8 + 20];
            uint8_t buffer[8 + 20];
            if (chunk_data_size < (ssize_t)sizeof(buffer)) {
            if (chunk_data_size < (ssize_t)sizeof(buffer)) {
                // Basic AudioSampleEntry size.
                // Basic AudioSampleEntry size.
@@ -1416,6 +1439,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('s', 't', 'c', 'o'):
        case FOURCC('s', 't', 'c', 'o'):
        case FOURCC('c', 'o', '6', '4'):
        case FOURCC('c', 'o', '6', '4'):
        {
        {
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            status_t err =
            status_t err =
                mLastTrack->sampleTable->setChunkOffsetParams(
                mLastTrack->sampleTable->setChunkOffsetParams(
                        chunk_type, data_offset, chunk_data_size);
                        chunk_type, data_offset, chunk_data_size);
@@ -1431,6 +1457,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {


        case FOURCC('s', 't', 's', 'c'):
        case FOURCC('s', 't', 's', 'c'):
        {
        {
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            status_t err =
            status_t err =
                mLastTrack->sampleTable->setSampleToChunkParams(
                mLastTrack->sampleTable->setSampleToChunkParams(
                        data_offset, chunk_data_size);
                        data_offset, chunk_data_size);
@@ -1447,6 +1476,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('s', 't', 's', 'z'):
        case FOURCC('s', 't', 's', 'z'):
        case FOURCC('s', 't', 'z', '2'):
        case FOURCC('s', 't', 'z', '2'):
        {
        {
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            status_t err =
            status_t err =
                mLastTrack->sampleTable->setSampleSizeParams(
                mLastTrack->sampleTable->setSampleSizeParams(
                        chunk_type, data_offset, chunk_data_size);
                        chunk_type, data_offset, chunk_data_size);
@@ -1530,6 +1562,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;


            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            status_t err =
            status_t err =
                mLastTrack->sampleTable->setTimeToSampleParams(
                mLastTrack->sampleTable->setTimeToSampleParams(
                        data_offset, chunk_data_size);
                        data_offset, chunk_data_size);
@@ -1545,6 +1580,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;


            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            status_t err =
            status_t err =
                mLastTrack->sampleTable->setCompositionTimeToSampleParams(
                mLastTrack->sampleTable->setCompositionTimeToSampleParams(
                        data_offset, chunk_data_size);
                        data_offset, chunk_data_size);
@@ -1560,6 +1598,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;


            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            status_t err =
            status_t err =
                mLastTrack->sampleTable->setSyncSampleParams(
                mLastTrack->sampleTable->setSyncSampleParams(
                        data_offset, chunk_data_size);
                        data_offset, chunk_data_size);
@@ -1610,6 +1651,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('e', 's', 'd', 's'):
        case FOURCC('e', 's', 'd', 's'):
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }


            if (chunk_data_size < 4) {
            if (chunk_data_size < 4) {
                return ERROR_MALFORMED;
                return ERROR_MALFORMED;
@@ -1654,6 +1698,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('a', 'v', 'c', 'C'):
        case FOURCC('a', 'v', 'c', 'C'):
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }


            sp<ABuffer> buffer = new ABuffer(chunk_data_size);
            sp<ABuffer> buffer = new ABuffer(chunk_data_size);


@@ -1675,6 +1722,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('h', 'v', 'c', 'C'):
        case FOURCC('h', 'v', 'c', 'C'):
        {
        {
            sp<ABuffer> buffer = new ABuffer(chunk_data_size);
            sp<ABuffer> buffer = new ABuffer(chunk_data_size);
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }


            if (buffer->data() == NULL) {
            if (buffer->data() == NULL) {
                ALOGE("b/28471206");
                ALOGE("b/28471206");
@@ -1696,6 +1746,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC('d', '2', '6', '3'):
        case FOURCC('d', '2', '6', '3'):
        {
        {
            *offset += chunk_size;
            *offset += chunk_size;
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            /*
            /*
             * d263 contains a fixed 7 bytes part:
             * d263 contains a fixed 7 bytes part:
             *   vendor - 4 bytes
             *   vendor - 4 bytes
@@ -1932,6 +1985,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {


        case FOURCC('t', 'x', '3', 'g'):
        case FOURCC('t', 'x', '3', 'g'):
        {
        {
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            uint32_t type;
            uint32_t type;
            const void *data;
            const void *data;
            size_t size = 0;
            size_t size = 0;
@@ -2047,6 +2103,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {


        case FOURCC('s', 'i', 'd', 'x'):
        case FOURCC('s', 'i', 'd', 'x'):
        {
        {
            if (mLastTrack == NULL) {
                return ERROR_MALFORMED;
            }
            parseSegmentIndex(data_offset, chunk_data_size);
            parseSegmentIndex(data_offset, chunk_data_size);
            *offset += chunk_size;
            *offset += chunk_size;
            return UNKNOWN_ERROR; // stop parsing after sidx
            return UNKNOWN_ERROR; // stop parsing after sidx
@@ -2409,6 +2468,9 @@ status_t MPEG4Extractor::parseITunesMetaData(off64_t offset, size_t size) {
                    int32_t delay, padding;
                    int32_t delay, padding;
                    if (sscanf(mLastCommentData,
                    if (sscanf(mLastCommentData,
                               " %*x %x %x %*x", &delay, &padding) == 2) {
                               " %*x %x %x %*x", &delay, &padding) == 2) {
                        if (mLastTrack == NULL) {
                            return ERROR_MALFORMED;
                        }
                        mLastTrack->meta->setInt32(kKeyEncoderDelay, delay);
                        mLastTrack->meta->setInt32(kKeyEncoderDelay, delay);
                        mLastTrack->meta->setInt32(kKeyEncoderPadding, padding);
                        mLastTrack->meta->setInt32(kKeyEncoderPadding, padding);
                    }
                    }