[pm] fix ConcurrentModificationException in AppsFilter

BUG: 275518570
Test: atest com.android.server.pm.AppsFilterImplTest
Test: atest CtsAppEnumerationTestCases
Change-Id: If40cf191fae12ae13633f4212c774bb277094520
This commit is contained in:
Songchun Fan
2023-05-04 16:18:48 -07:00
committed by Song Chun Fan
parent 9e6c6ca843
commit 2e278e384c

View File

@@ -256,6 +256,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
private final PackageManagerInternal mPmInternal;
private volatile boolean mFeatureEnabled =
PackageManager.APP_ENUMERATION_ENABLED_BY_DEFAULT;
@GuardedBy("mDisabledPackages")
private final ArraySet<String> mDisabledPackages = new ArraySet<>();
@Nullable
@@ -272,7 +273,9 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
mInjector = null;
mPmInternal = null;
mFeatureEnabled = orig.mFeatureEnabled;
mDisabledPackages.addAll(orig.mDisabledPackages);
synchronized (orig.mDisabledPackages) {
mDisabledPackages.addAll(orig.mDisabledPackages);
}
mLoggingEnabled = orig.mLoggingEnabled;
}
@@ -319,7 +322,9 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "packageIsEnabled");
}
try {
return !mDisabledPackages.contains(pkg.getPackageName());
synchronized (mDisabledPackages) {
return !mDisabledPackages.contains(pkg.getPackageName());
}
} finally {
if (DEBUG_TRACING) {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
@@ -376,10 +381,12 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
final boolean enabled = mInjector.getCompatibility().isChangeEnabledInternalNoLogging(
PackageManager.FILTER_APPLICATION_QUERY,
AndroidPackageUtils.generateAppInfoWithoutState(pkg));
if (enabled) {
mDisabledPackages.remove(pkg.getPackageName());
} else {
mDisabledPackages.add(pkg.getPackageName());
synchronized (mDisabledPackages) {
if (enabled) {
mDisabledPackages.remove(pkg.getPackageName());
} else {
mDisabledPackages.add(pkg.getPackageName());
}
}
if (mAppsFilter != null) {
mAppsFilter.onChanged();
@@ -393,7 +400,9 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
|| setting.getPkg().isDebuggable());
enableLogging(setting.getAppId(), enableLogging);
if (removed) {
mDisabledPackages.remove(setting.getPackageName());
synchronized (mDisabledPackages) {
mDisabledPackages.remove(setting.getPackageName());
}
if (mAppsFilter != null) {
mAppsFilter.onChanged();
}