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

Commit 31170156 authored by Girish's avatar Girish Committed by Automerger Merge Worker
Browse files

[automerge] libstagefright: fix heap use after free issue 2p: 2bddcbdd 2p:...

[automerge] libstagefright: fix heap use after free issue 2p: 2bddcbdd 2p: a648552f am: d56cb24c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/20068332



Change-Id: Icf0a9b4d841737adec6c2426794cc02402e0e43b
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents b618eab6 d56cb24c
Loading
Loading
Loading
Loading
+34 −61
Original line number Diff line number Diff line
@@ -72,31 +72,17 @@ NuMediaExtractor::~NuMediaExtractor() {
    }
}

status_t NuMediaExtractor::setDataSource(
        const sp<MediaHTTPService> &httpService,
        const char *path,
        const KeyedVector<String8, String8> *headers) {
    Mutex::Autolock autoLock(mLock);

    if (mImpl != NULL || path == NULL) {
        return -EINVAL;
    }

    sp<DataSource> dataSource =
        DataSourceFactory::getInstance()->CreateFromURI(httpService, path, headers);

    if (dataSource == NULL) {
        return -ENOENT;
    }
status_t NuMediaExtractor::initMediaExtractor(const sp<DataSource>& dataSource) {
    status_t err = OK;

    mImpl = MediaExtractorFactory::Create(dataSource);

    if (mImpl == NULL) {
        ALOGE("%s: failed to create MediaExtractor", __FUNCTION__);
        return ERROR_UNSUPPORTED;
    }

    setEntryPointToRemoteMediaExtractor();

    status_t err = OK;
    if (!mCasToken.empty()) {
        err = mImpl->setMediaCas(mCasToken);
        if (err != OK) {
@@ -105,6 +91,10 @@ status_t NuMediaExtractor::setDataSource(
        }
    }

    // Get the name of the implementation.
    mName = mImpl->name();

    // Update the duration and bitrate
    err = updateDurationAndBitrate();
    if (err == OK) {
        mDataSource = dataSource;
@@ -113,6 +103,27 @@ status_t NuMediaExtractor::setDataSource(
    return OK;
}

status_t NuMediaExtractor::setDataSource(
        const sp<MediaHTTPService> &httpService,
        const char *path,
        const KeyedVector<String8, String8> *headers) {
    Mutex::Autolock autoLock(mLock);

    if (mImpl != NULL || path == NULL) {
        return -EINVAL;
    }

    sp<DataSource> dataSource =
        DataSourceFactory::getInstance()->CreateFromURI(httpService, path, headers);

    if (dataSource == NULL) {
        return -ENOENT;
    }

    // Initialize MediaExtractor using the data source
    return initMediaExtractor(dataSource);
}

status_t NuMediaExtractor::setDataSource(int fd, off64_t offset, off64_t size) {

    ALOGV("setDataSource fd=%d (%s), offset=%lld, length=%lld",
@@ -131,27 +142,8 @@ status_t NuMediaExtractor::setDataSource(int fd, off64_t offset, off64_t size) {
        return err;
    }

    mImpl = MediaExtractorFactory::Create(fileSource);

    if (mImpl == NULL) {
        return ERROR_UNSUPPORTED;
    }
    setEntryPointToRemoteMediaExtractor();

    if (!mCasToken.empty()) {
        err = mImpl->setMediaCas(mCasToken);
        if (err != OK) {
            ALOGE("%s: failed to setMediaCas (%d)", __FUNCTION__, err);
            return err;
        }
    }

    err = updateDurationAndBitrate();
    if (err == OK) {
        mDataSource = fileSource;
    }

    return OK;
    // Initialize MediaExtractor using the file source
    return initMediaExtractor(fileSource);
}

status_t NuMediaExtractor::setDataSource(const sp<DataSource> &source) {
@@ -166,32 +158,13 @@ status_t NuMediaExtractor::setDataSource(const sp<DataSource> &source) {
        return err;
    }

    mImpl = MediaExtractorFactory::Create(source);

    if (mImpl == NULL) {
        return ERROR_UNSUPPORTED;
    }
    setEntryPointToRemoteMediaExtractor();

    if (!mCasToken.empty()) {
        err = mImpl->setMediaCas(mCasToken);
        if (err != OK) {
            ALOGE("%s: failed to setMediaCas (%d)", __FUNCTION__, err);
            return err;
        }
    }

    err = updateDurationAndBitrate();
    if (err == OK) {
        mDataSource = source;
    }

    return err;
    // Initialize MediaExtractor using the given data source
    return initMediaExtractor(source);
}

const char* NuMediaExtractor::getName() const {
    Mutex::Autolock autoLock(mLock);
    return mImpl == nullptr ? nullptr : mImpl->name().string();
    return mImpl == nullptr ? nullptr : mName.string();
}

static String8 arrayToString(const std::vector<uint8_t> &array) {
+2 −0
Original line number Diff line number Diff line
@@ -146,6 +146,7 @@ private:
    Vector<TrackInfo> mSelectedTracks;
    int64_t mTotalBitrate;  // in bits/sec
    int64_t mDurationUs;
    String8 mName;

    void setEntryPointToRemoteMediaExtractor();

@@ -165,6 +166,7 @@ private:
    bool getTotalBitrate(int64_t *bitRate) const;
    status_t updateDurationAndBitrate();
    status_t appendVorbisNumPageSamples(MediaBufferBase *mbuf, const sp<ABuffer> &buffer);
    status_t initMediaExtractor(const sp<DataSource>& dataSource);

    DISALLOW_EVIL_CONSTRUCTORS(NuMediaExtractor);
};