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

Commit 80d23935 authored by Steven Moreland's avatar Steven Moreland
Browse files

binder: Bp: clear DRs in onLastStrongRef

This way, if unlink is not called, the binder will properly
destruct. Currently linkToDeath takes a weakRef, and when
BR_DEAD_BINDER is received, userspace binder sends
BC_CLEAR_DEATH_NOTIFICATION for each death notification. Then, when it
receives BR_CLEAR_DEATH_NOTIFICATION_DONE (maybe later?), it clears the
weak ref. Right now, ~BpBinder also clears these. However, by moving
this clearing up to onLastStrongRef, forgotten unlinks will no longer
cause a cycle (that is only cleared when the service dies).

Bug: 134576445
Test: manually linking to death many times without unlinking.
Change-Id: Iaf6ce7a65c334805ae2dc146b9f0aa7731a99c0d
parent 49b166e2
Loading
Loading
Loading
Loading
+19 −15
Original line number Diff line number Diff line
@@ -387,21 +387,6 @@ BpBinder::~BpBinder()
        }
    }

    mLock.lock();
    Vector<Obituary>* obits = mObituaries;
    if(obits != nullptr) {
        if (ipc) ipc->clearDeathNotification(mHandle, this);
        mObituaries = nullptr;
    }
    mLock.unlock();

    if (obits != nullptr) {
        // XXX Should we tell any remaining DeathRecipient
        // objects that the last strong ref has gone away, so they
        // are no longer linked?
        delete obits;
    }

    if (ipc) {
        ipc->expungeHandle(mHandle, this);
        ipc->decWeakHandle(mHandle);
@@ -423,6 +408,25 @@ void BpBinder::onLastStrongRef(const void* /*id*/)
    }
    IPCThreadState* ipc = IPCThreadState::self();
    if (ipc) ipc->decStrongHandle(mHandle);

    mLock.lock();
    Vector<Obituary>* obits = mObituaries;
    if(obits != nullptr) {
        if (!obits->isEmpty()) {
            ALOGI("onLastStrongRef automatically unlinking death recipients");
        }

        if (ipc) ipc->clearDeathNotification(mHandle, this);
        mObituaries = nullptr;
    }
    mLock.unlock();

    if (obits != nullptr) {
        // XXX Should we tell any remaining DeathRecipient
        // objects that the last strong ref has gone away, so they
        // are no longer linked?
        delete obits;
    }
}

bool BpBinder::onIncStrongAttempted(uint32_t /*flags*/, const void* /*id*/)