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

Commit 8d27f5e1 authored by Marco Nelissen's avatar Marco Nelissen
Browse files

IMediaExtractor: protect access to extractor info list

Bug: 27970490
Bug: 27970718
Bug: 27970489

Change-Id: If896f6519986331702ffa41b1602e008b106f391
parent 25df0fc0
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -216,13 +216,15 @@ String8 ExtractorInstance::toString() const {
    return str;
}

static Vector<ExtractorInstance> extractors;
static Vector<ExtractorInstance> sExtractors;
static Mutex sExtractorsLock;

void registerMediaSource(
        const sp<IMediaExtractor> &ex,
        const sp<IMediaSource> &source) {
    for (size_t i = 0; i < extractors.size(); i++) {
        ExtractorInstance &instance = extractors.editItemAt(i);
    Mutex::Autolock lock(sExtractorsLock);
    for (size_t i = 0; i < sExtractors.size(); i++) {
        ExtractorInstance &instance = sExtractors.editItemAt(i);
        sp<IMediaExtractor> extractor = instance.extractor.promote();
        if (extractor != NULL && extractor == ex) {
            if (instance.tracks.size() > 5) {
@@ -246,20 +248,26 @@ void registerMediaExtractor(
    ex.owner = IPCThreadState::self()->getCallingPid();
    ex.extractor = extractor;

    if (extractors.size() > 10) {
        extractors.resize(10);
    {
        Mutex::Autolock lock(sExtractorsLock);
        if (sExtractors.size() > 10) {
            sExtractors.resize(10);
        }
        sExtractors.push_front(ex);
    }
    extractors.push_front(ex);
}

status_t dumpExtractors(int fd, const Vector<String16>&) {
    String8 out;
    out.append("Recent extractors, most recent first:\n");
    for (size_t i = 0; i < extractors.size(); i++) {
        const ExtractorInstance &instance = extractors.itemAt(i);
    {
        Mutex::Autolock lock(sExtractorsLock);
        for (size_t i = 0; i < sExtractors.size(); i++) {
            const ExtractorInstance &instance = sExtractors.itemAt(i);
            out.append("  ");
            out.append(instance.toString());
        }
    }
    write(fd, out.string(), out.size());
    return OK;
}