summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Winson <chiuwinson@google.com> 2022-04-14 18:46:20 -0700
committer Winson <chiuwinson@google.com> 2022-04-14 18:47:06 -0700
commit09d24aba05f20bb223d3c58da09d499fad4d504d (patch)
treee9a5115baeed9936299b3b845671335958c3244a
parentb121b54fb47769fffefff7b4f155eb4823723838 (diff)
Lock ComponentResolver when taking snapshot
Otherwise it's possible to hit a concurrent modification exception when the data structures are edited while a snapshot is being taken. Bug: 229326910 Test: presubmit Change-Id: Ib15551a5096c47f5a238863466af08a4a88f82b9
-rw-r--r--services/core/java/com/android/server/pm/resolution/ComponentResolver.java11
1 files changed, 7 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java
index 9aa53f18d0aa..7baec6217e2e 100644
--- a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java
+++ b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java
@@ -79,7 +79,8 @@ import java.util.Set;
import java.util.function.Function;
/** Resolves all Android component types [activities, services, providers and receivers]. */
-public class ComponentResolver extends ComponentResolverLocked implements Snappable {
+public class ComponentResolver extends ComponentResolverLocked implements
+ Snappable<ComponentResolverApi> {
private static final boolean DEBUG = false;
private static final String TAG = "PackageManager";
private static final boolean DEBUG_FILTERS = false;
@@ -166,11 +167,13 @@ public class ComponentResolver extends ComponentResolverLocked implements Snappa
mProvidersByAuthority = new ArrayMap<>();
mDeferProtectedFilters = true;
- mSnapshot = new SnapshotCache<ComponentResolverApi>(this, this) {
+ mSnapshot = new SnapshotCache<>(this, this) {
@Override
public ComponentResolverApi createSnapshot() {
- return new ComponentResolverSnapshot(ComponentResolver.this,
- userNeedsBadgingCache);
+ synchronized (mLock) {
+ return new ComponentResolverSnapshot(ComponentResolver.this,
+ userNeedsBadgingCache);
+ }
}};
}