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
This commit is contained in:
Winson Chung
2021-11-20 06:39:15 +00:00
parent 26409be79e
commit 7567f970d6

View File

@@ -513,9 +513,13 @@ public class CommandQueue extends IStatusBar.Stub implements
* @param animate {@code true} to show animations.
*/
public void recomputeDisableFlags(int displayId, boolean animate) {
int disabled1 = getDisabled1(displayId);
int disabled2 = getDisabled2(displayId);
disable(displayId, disabled1, disabled2, 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) {