From b0601cded3b81c4db1c7d077da6053d206b973b0 Mon Sep 17 00:00:00 2001 From: Santos Cordon Date: Fri, 14 Apr 2023 12:05:39 +0100 Subject: [PATCH] Fix off-by-one error when releasing wakelocks. Bug: 275208335 Test: atest WakelockControllerTest Change-Id: I4be650ddd0490b23b2636fc27a7ae93dc71e5c11 --- .../android/server/display/WakelockController.java | 6 ++++-- .../server/display/WakelockControllerTest.java | 11 +++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/display/WakelockController.java b/services/core/java/com/android/server/display/WakelockController.java index 6511f4f4fa84d..1e13974f6ef4a 100644 --- a/services/core/java/com/android/server/display/WakelockController.java +++ b/services/core/java/com/android/server/display/WakelockController.java @@ -38,7 +38,9 @@ public final class WakelockController { public static final int WAKE_LOCK_STATE_CHANGED = 4; public static final int WAKE_LOCK_UNFINISHED_BUSINESS = 5; - private static final int WAKE_LOCK_MAX = WAKE_LOCK_UNFINISHED_BUSINESS; + @VisibleForTesting + static final int WAKE_LOCK_MAX = WAKE_LOCK_UNFINISHED_BUSINESS; + private static final boolean DEBUG = false; @IntDef(flag = true, prefix = "WAKE_LOCK_", value = { @@ -132,7 +134,7 @@ public final class WakelockController { * A utility to release all the wakelock acquired by the system */ public void releaseAll() { - for (int i = WAKE_LOCK_PROXIMITY_POSITIVE; i < WAKE_LOCK_MAX; i++) { + for (int i = WAKE_LOCK_PROXIMITY_POSITIVE; i <= WAKE_LOCK_MAX; i++) { releaseWakelockInternal(i); } } diff --git a/services/tests/mockingservicestests/src/com/android/server/display/WakelockControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/WakelockControllerTest.java index 07a81ffb8e18d..c23d4b19cd3ac 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/WakelockControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/WakelockControllerTest.java @@ -244,6 +244,15 @@ public final class WakelockControllerTest { verifyZeroInteractions(mDisplayPowerCallbacks); } + @Test + public void testReleaseAll() throws Exception { + // Use WAKE_LOCK_MAX to verify it has been correctly set and used in releaseAll(). + verifyWakelockAcquisition(WakelockController.WAKE_LOCK_MAX, + () -> mWakelockController.hasUnfinishedBusiness()); + mWakelockController.releaseAll(); + assertFalse(mWakelockController.hasUnfinishedBusiness()); + } + private void verifyWakelockAcquisitionAndReaquisition(int wakelockId, Callable isWakelockAcquiredCallable) throws Exception { @@ -284,6 +293,4 @@ public final class WakelockControllerTest { assertFalse(mWakelockController.releaseWakelock(wakelockId)); assertFalse(isWakelockAcquiredCallable.call()); } - - }