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

Commit 3c290511 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Fix potential NPE when removing TaskOrganizerController

Since unregister can be called from other process, the
TaskOrganizerState may be removed from different thread.

Bug: 139371701
Test: atest TaskOrganizerTests
Change-Id: I4ede04e68fdf70f55f65db4193035d9266445ee3
parent 8927986f
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -75,9 +75,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
            synchronized (mGlobalLock) {
                final TaskOrganizerState state = mTaskOrganizerStates.remove(
                        mTaskOrganizer.asBinder());
                if (state != null) {
                    state.dispose();
                }
            }
        }
    };

    private class TaskOrganizerState {
@@ -216,10 +218,21 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {

    @Override
    public void unregisterTaskOrganizer(ITaskOrganizer organizer) {
        enforceStackPermission("unregisterTaskOrganizer()");
        final long origId = Binder.clearCallingIdentity();
        try {
            synchronized (mGlobalLock) {
                final TaskOrganizerState state = mTaskOrganizerStates.remove(organizer.asBinder());
                if (state == null) {
                    return;
                }
                state.unlinkDeath();
                state.dispose();
            }
        } finally {
            Binder.restoreCallingIdentity(origId);
        }
    }

    ITaskOrganizer getTaskOrganizer(int windowingMode) {
        final IBinder organizer =