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

Commit 7567f970 authored by Winson Chung's avatar Winson Chung
Browse files

Prevent recomputeDisableFlags from clobbering the system disable flags

- The disable() call on the binder thread can race with this call on
  the main thread due to this 1) fetching the old values on the main
  thread, then 2) trying to synchronize on mLock by calling disable()
  (which the binder thread is currently holding) and then 3) applying
  the previous flags immediately after the fresh disable flags are set
  by the binder call.

Bug: 205921118
Test: atest SystemUITests
Change-Id: I5dd4d2d248b6c1ab6d1677e2bb915100cd3e4f4e
parent 26409be7
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -513,10 +513,14 @@ public class CommandQueue extends IStatusBar.Stub implements
     * @param animate {@code true} to show animations.
     */
    public void recomputeDisableFlags(int displayId, boolean animate) {
        // This must update holding the lock otherwise it can clobber the disabled flags set on the
        // binder thread from the disable() call
        synchronized (mLock) {
            int disabled1 = getDisabled1(displayId);
            int disabled2 = getDisabled2(displayId);
            disable(displayId, disabled1, disabled2, animate);
        }
    }

    private void setDisabled(int displayId, int disabled1, int disabled2) {
        mDisplayDisabled.put(displayId, new Pair<>(disabled1, disabled2));