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

Commit 322db26b authored by Wei Jia's avatar Wei Jia
Browse files

IMediaExtractor: ensure users to check returned value by getTrack.

Test: fix the crash from the stream in the bug.
Bug: 37777357
Change-Id: Ia99907c396a2074a9419db9b8103a9325b290169
parent 02cccfd9
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -1048,6 +1048,10 @@ int main(int argc, char **argv) {
                bool haveVideo = false;
                bool haveVideo = false;
                for (size_t i = 0; i < numTracks; ++i) {
                for (size_t i = 0; i < numTracks; ++i) {
                    sp<IMediaSource> source = extractor->getTrack(i);
                    sp<IMediaSource> source = extractor->getTrack(i);
                    if (source == nullptr) {
                        fprintf(stderr, "skip NULL track %zu, track count %zu.\n", i, numTracks);
                        continue;
                    }


                    const char *mime;
                    const char *mime;
                    CHECK(source->getFormat()->findCString(
                    CHECK(source->getFormat()->findCString(
@@ -1110,6 +1114,10 @@ int main(int argc, char **argv) {
                }
                }


                mediaSource = extractor->getTrack(i);
                mediaSource = extractor->getTrack(i);
                if (mediaSource == nullptr) {
                    fprintf(stderr, "skip NULL track %zu, total tracks %zu.\n", i, numTracks);
                    return -1;
                }
            }
            }
        }
        }


+8 −2
Original line number Original line Diff line number Diff line
@@ -171,7 +171,8 @@ MyConvertingStreamSource::MyConvertingStreamSource(const char *filename)
    mWriter = new MPEG2TSWriter(
    mWriter = new MPEG2TSWriter(
            this, &MyConvertingStreamSource::WriteDataWrapper);
            this, &MyConvertingStreamSource::WriteDataWrapper);


    for (size_t i = 0; i < extractor->countTracks(); ++i) {
    size_t numTracks = extractor->countTracks();
    for (size_t i = 0; i < numTracks; ++i) {
        const sp<MetaData> &meta = extractor->getTrackMetaData(i);
        const sp<MetaData> &meta = extractor->getTrackMetaData(i);


        const char *mime;
        const char *mime;
@@ -181,7 +182,12 @@ MyConvertingStreamSource::MyConvertingStreamSource(const char *filename)
            continue;
            continue;
        }
        }


        CHECK_EQ(mWriter->addSource(extractor->getTrack(i)), (status_t)OK);
        sp<IMediaSource> track = extractor->getTrack(i);
        if (track == nullptr) {
            fprintf(stderr, "skip NULL track %zu, total tracks %zu\n", i, numTracks);
            continue;
        }
        CHECK_EQ(mWriter->addSource(track), (status_t)OK);
    }
    }


    CHECK_EQ(mWriter->start(), (status_t)OK);
    CHECK_EQ(mWriter->start(), (status_t)OK);
+3 −0
Original line number Original line Diff line number Diff line
@@ -34,6 +34,9 @@ public:
    DECLARE_META_INTERFACE(MediaExtractor);
    DECLARE_META_INTERFACE(MediaExtractor);


    virtual size_t countTracks() = 0;
    virtual size_t countTracks() = 0;
    // This function could return NULL IMediaSource even when index is within the
    // track count returned by countTracks, since it's possible the track is malformed
    // and it's not detected during countTracks call.
    virtual sp<IMediaSource> getTrack(size_t index) = 0;
    virtual sp<IMediaSource> getTrack(size_t index) = 0;


    enum GetTrackMetaDataFlags {
    enum GetTrackMetaDataFlags {
+4 −0
Original line number Original line Diff line number Diff line
@@ -297,6 +297,10 @@ status_t NuMediaExtractor::selectTrack(size_t index) {


    sp<IMediaSource> source = mImpl->getTrack(index);
    sp<IMediaSource> source = mImpl->getTrack(index);


    if (source == nullptr) {
        return ERROR_MALFORMED;
    }

    status_t ret = source->start();
    status_t ret = source->start();
    if (ret != OK) {
    if (ret != OK) {
        return ret;
        return ret;