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

Commit fdc6e509 authored by Robert Shih's avatar Robert Shih
Browse files

Fix NULL dereferences in OMX.cpp

Bug: 23484160
Change-Id: Ic42bca2a0079e0dd33f1476174e928991eed6265
parent 18c38e49
Loading
Loading
Loading
Loading
+174 −25
Original line number Diff line number Diff line
@@ -288,14 +288,26 @@ status_t OMX::freeNode(node_id node) {

status_t OMX::sendCommand(
        node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
    return findInstance(node)->sendCommand(cmd, param);
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->sendCommand(cmd, param);
}

status_t OMX::getParameter(
        node_id node, OMX_INDEXTYPE index,
        void *params, size_t size) {
    ALOGV("getParameter(%u %#x %p %zd)", node, index, params, size);
    return findInstance(node)->getParameter(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->getParameter(
            index, params, size);
}

@@ -303,84 +315,162 @@ status_t OMX::setParameter(
        node_id node, OMX_INDEXTYPE index,
        const void *params, size_t size) {
    ALOGV("setParameter(%u %#x %p %zd)", node, index, params, size);
    return findInstance(node)->setParameter(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->setParameter(
            index, params, size);
}

status_t OMX::getConfig(
        node_id node, OMX_INDEXTYPE index,
        void *params, size_t size) {
    return findInstance(node)->getConfig(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->getConfig(
            index, params, size);
}

status_t OMX::setConfig(
        node_id node, OMX_INDEXTYPE index,
        const void *params, size_t size) {
    return findInstance(node)->setConfig(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->setConfig(
            index, params, size);
}

status_t OMX::getState(
        node_id node, OMX_STATETYPE* state) {
    return findInstance(node)->getState(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->getState(
            state);
}

status_t OMX::enableGraphicBuffers(
        node_id node, OMX_U32 port_index, OMX_BOOL enable) {
    return findInstance(node)->enableGraphicBuffers(port_index, enable);
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->enableGraphicBuffers(port_index, enable);
}

status_t OMX::getGraphicBufferUsage(
        node_id node, OMX_U32 port_index, OMX_U32* usage) {
    return findInstance(node)->getGraphicBufferUsage(port_index, usage);
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->getGraphicBufferUsage(port_index, usage);
}

status_t OMX::storeMetaDataInBuffers(
        node_id node, OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type) {
    return findInstance(node)->storeMetaDataInBuffers(port_index, enable, type);
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->storeMetaDataInBuffers(port_index, enable, type);
}

status_t OMX::prepareForAdaptivePlayback(
        node_id node, OMX_U32 portIndex, OMX_BOOL enable,
        OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) {
    return findInstance(node)->prepareForAdaptivePlayback(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->prepareForAdaptivePlayback(
            portIndex, enable, maxFrameWidth, maxFrameHeight);
}

status_t OMX::configureVideoTunnelMode(
        node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
        OMX_U32 audioHwSync, native_handle_t **sidebandHandle) {
    return findInstance(node)->configureVideoTunnelMode(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->configureVideoTunnelMode(
            portIndex, tunneled, audioHwSync, sidebandHandle);
}

status_t OMX::useBuffer(
        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
        buffer_id *buffer, OMX_U32 allottedSize) {
    return findInstance(node)->useBuffer(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->useBuffer(
            port_index, params, buffer, allottedSize);
}

status_t OMX::useGraphicBuffer(
        node_id node, OMX_U32 port_index,
        const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
    return findInstance(node)->useGraphicBuffer(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->useGraphicBuffer(
            port_index, graphicBuffer, buffer);
}

status_t OMX::updateGraphicBufferInMeta(
        node_id node, OMX_U32 port_index,
        const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
    return findInstance(node)->updateGraphicBufferInMeta(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->updateGraphicBufferInMeta(
            port_index, graphicBuffer, buffer);
}

status_t OMX::createInputSurface(
        node_id node, OMX_U32 port_index,
        sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) {
    return findInstance(node)->createInputSurface(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->createInputSurface(
            port_index, bufferProducer, type);
}

@@ -394,35 +484,71 @@ status_t OMX::createPersistentInputSurface(
status_t OMX::setInputSurface(
        node_id node, OMX_U32 port_index,
        const sp<IGraphicBufferConsumer> &bufferConsumer, MetadataBufferType *type) {
    return findInstance(node)->setInputSurface(port_index, bufferConsumer, type);
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->setInputSurface(port_index, bufferConsumer, type);
}


status_t OMX::signalEndOfInputStream(node_id node) {
    return findInstance(node)->signalEndOfInputStream();
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->signalEndOfInputStream();
}

status_t OMX::allocateBuffer(
        node_id node, OMX_U32 port_index, size_t size,
        buffer_id *buffer, void **buffer_data) {
    return findInstance(node)->allocateBuffer(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->allocateBuffer(
            port_index, size, buffer, buffer_data);
}

status_t OMX::allocateBufferWithBackup(
        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
        buffer_id *buffer, OMX_U32 allottedSize) {
    return findInstance(node)->allocateBufferWithBackup(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->allocateBufferWithBackup(
            port_index, params, buffer, allottedSize);
}

status_t OMX::freeBuffer(node_id node, OMX_U32 port_index, buffer_id buffer) {
    return findInstance(node)->freeBuffer(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->freeBuffer(
            port_index, buffer);
}

status_t OMX::fillBuffer(node_id node, buffer_id buffer, int fenceFd) {
    return findInstance(node)->fillBuffer(buffer, fenceFd);
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->fillBuffer(buffer, fenceFd);
}

status_t OMX::emptyBuffer(
@@ -430,7 +556,13 @@ status_t OMX::emptyBuffer(
        buffer_id buffer,
        OMX_U32 range_offset, OMX_U32 range_length,
        OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
    return findInstance(node)->emptyBuffer(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->emptyBuffer(
            buffer, range_offset, range_length, flags, timestamp, fenceFd);
}

@@ -438,7 +570,13 @@ status_t OMX::getExtensionIndex(
        node_id node,
        const char *parameter_name,
        OMX_INDEXTYPE *index) {
    return findInstance(node)->getExtensionIndex(
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->getExtensionIndex(
            parameter_name, index);
}

@@ -448,7 +586,13 @@ status_t OMX::setInternalOption(
        InternalOptionType type,
        const void *data,
        size_t size) {
    return findInstance(node)->setInternalOption(port_index, type, data, size);
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return NAME_NOT_FOUND;
    }

    return instance->setInternalOption(port_index, type, data, size);
}

OMX_ERRORTYPE OMX::OnEvent(
@@ -458,9 +602,14 @@ OMX_ERRORTYPE OMX::OnEvent(
        OMX_IN OMX_U32 nData2,
        OMX_IN OMX_PTR pEventData) {
    ALOGV("OnEvent(%d, %" PRIu32", %" PRIu32 ")", eEvent, nData1, nData2);
    OMXNodeInstance *instance = findInstance(node);

    if (instance == NULL) {
        return OMX_ErrorComponentNotFound;
    }

    // Forward to OMXNodeInstance.
    findInstance(node)->onEvent(eEvent, nData1, nData2);
    instance->onEvent(eEvent, nData1, nData2);

    sp<OMX::CallbackDispatcher> dispatcher = findDispatcher(node);