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

Commit 990bc6de authored by Praveen Chavan's avatar Praveen Chavan Committed by Pawin Vongmasa
Browse files

Omx: Fix codec instance leak if Observer dies

If Observer dies, {instance, observer} book-keeping may be
cleaned up. In such case avoid only unlinking the death-notifier,
but proceed with instance cleanup

Test: Manual use of Camera, Photos, Play Movies and YouTube.
Test: Small CtsMediaTestCases

Bug: 38149818
Change-Id: I412953b55827c93730353a95560b865fb18b5f0f
parent afc598db
Loading
Loading
Loading
Loading
+13 −17
Original line number Diff line number Diff line
@@ -180,27 +180,23 @@ status_t Omx::freeNode(sp<OMXNodeInstance> const& instance) {
        return OK;
    }

    wp<IBase> observer;
    {
        Mutex::Autolock autoLock(mLock);
        ssize_t observerIndex = mNode2Observer.indexOfKey(instance.get());
        if (observerIndex < 0) {
            return OK;
        }
        observer = mNode2Observer.valueAt(observerIndex);
        if (observerIndex >= 0) {
            wp<IBase> observer = mNode2Observer.valueAt(observerIndex);
            ssize_t nodeIndex = mLiveNodes.indexOfKey(observer);
        if (nodeIndex < 0) {
            return OK;
        }
            if (nodeIndex >= 0) {
                mNode2Observer.removeItemsAt(observerIndex);
                mLiveNodes.removeItemsAt(nodeIndex);
    }

    {
                sp<IBase> sObserver = observer.promote();
                if (sObserver != nullptr) {
                    sObserver->unlinkToDeath(this);
                }
            } else {
                LOG(WARNING) << "Inconsistent observer record";
            }
        }
    }

    OMX_ERRORTYPE err = OMX_ErrorNone;