Fix deadlock on CompatConfig.mChanges

Only lock mChanges long enough to get a local copy of the list of
changes.

Bug: 181021273

Change-Id: I22e97e58b4fe9dbc70d11660f93c4afb5d514d24
This commit is contained in:
Andrei Onea
2021-02-24 15:24:39 +00:00
committed by Andrei-Valentin Onea
parent 359eca32b3
commit 1ec53ec507

View File

@@ -50,6 +50,7 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -595,18 +596,24 @@ final class CompatConfig {
* Rechecks all the existing overrides for a package.
*/
void recheckOverrides(String packageName) {
// Local cache of compat changes. Holding a lock on mChanges for the whole duration of the
// method will cause a deadlock.
List<CompatChange> changes;
synchronized (mChanges) {
boolean shouldInvalidateCache = false;
changes = new ArrayList<>(mChanges.size());
for (int idx = 0; idx < mChanges.size(); ++idx) {
CompatChange c = mChanges.valueAt(idx);
OverrideAllowedState allowedState =
mOverrideValidator.getOverrideAllowedState(c.getId(), packageName);
shouldInvalidateCache |= c.recheckOverride(packageName, allowedState, mContext);
}
if (shouldInvalidateCache) {
invalidateCache();
changes.add(mChanges.valueAt(idx));
}
}
boolean shouldInvalidateCache = false;
for (CompatChange c: changes) {
OverrideAllowedState allowedState =
mOverrideValidator.getOverrideAllowedState(c.getId(), packageName);
shouldInvalidateCache |= c.recheckOverride(packageName, allowedState, mContext);
}
if (shouldInvalidateCache) {
invalidateCache();
}
}
void registerContentObserver() {