From 77ea683cb5ea5f23a8bfda728b609c971baf731e Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Mon, 13 Sep 2021 15:12:14 -0700 Subject: [PATCH] Fix inverse lock order in AppsFilter Bug: 199332741 Test: manual test: $ m ComponentAliasTests $ adb install -r $OUT/testcases/ComponentAliasTests/arm64/ComponentAliasTests.apk $ adb shell am compat disable FILTER_APPLICATION_QUERY android.content.componentalias.tests $ adb install -r $OUT/testcases/ComponentAliasTests/arm64/ComponentAliasTests.apk -> This shouldn't hang up the device Change-Id: Ie9f903e312a4e7c3e64c2aac06d9e0cb1792eecf --- .../com/android/server/pm/AppsFilter.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 3818d74cfa0db..db0f1eb661710 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -300,6 +300,8 @@ public class AppsFilter implements Watchable, Snappable { /** * Provides system state to AppsFilter via {@link CurrentStateCallback} after properly guarding * the data with the package lock. + * + * Don't call {@link #runWithState} with {@link #mCacheLock} held. */ @VisibleForTesting(visibility = PRIVATE) public interface StateProvider { @@ -923,15 +925,16 @@ public class AppsFilter implements Watchable, Snappable { } private void updateShouldFilterCacheForPackage(String packageName) { - synchronized (mCacheLock) { - if (mShouldFilterCache != null) { - mStateProvider.runWithState((settings, users) -> { - updateShouldFilterCacheForPackage(mShouldFilterCache, null /* skipPackage */, - settings.get(packageName), settings, users, - settings.size() /*maxIndex*/); - }); + mStateProvider.runWithState((settings, users) -> { + synchronized (mCacheLock) { + if (mShouldFilterCache == null) { + return; + } + updateShouldFilterCacheForPackage(mShouldFilterCache, null /* skipPackage */, + settings.get(packageName), settings, users, + settings.size() /*maxIndex*/); } - } + }); } private void updateShouldFilterCacheForPackage(WatchedSparseBooleanMatrix cache,