Merge "[pm] Fix missing locks in PackageManagerService" into tm-dev
diff --git a/services/core/java/com/android/server/pm/ChangedPackagesTracker.java b/services/core/java/com/android/server/pm/ChangedPackagesTracker.java
index bd12981..3802135 100644
--- a/services/core/java/com/android/server/pm/ChangedPackagesTracker.java
+++ b/services/core/java/com/android/server/pm/ChangedPackagesTracker.java
@@ -90,25 +90,27 @@
}
void updateSequenceNumber(@NonNull String packageName, int[] userList) {
- for (int i = userList.length - 1; i >= 0; --i) {
- final int userId = userList[i];
- SparseArray<String> changedPackages = mUserIdToSequenceToPackage.get(userId);
- if (changedPackages == null) {
- changedPackages = new SparseArray<>();
- mUserIdToSequenceToPackage.put(userId, changedPackages);
+ synchronized (mLock) {
+ for (int i = userList.length - 1; i >= 0; --i) {
+ final int userId = userList[i];
+ SparseArray<String> changedPackages = mUserIdToSequenceToPackage.get(userId);
+ if (changedPackages == null) {
+ changedPackages = new SparseArray<>();
+ mUserIdToSequenceToPackage.put(userId, changedPackages);
+ }
+ Map<String, Integer> sequenceNumbers = mChangedPackagesSequenceNumbers.get(userId);
+ if (sequenceNumbers == null) {
+ sequenceNumbers = new HashMap<>();
+ mChangedPackagesSequenceNumbers.put(userId, sequenceNumbers);
+ }
+ final Integer sequenceNumber = sequenceNumbers.get(packageName);
+ if (sequenceNumber != null) {
+ changedPackages.remove(sequenceNumber);
+ }
+ changedPackages.put(mChangedPackagesSequenceNumber, packageName);
+ sequenceNumbers.put(packageName, mChangedPackagesSequenceNumber);
}
- Map<String, Integer> sequenceNumbers = mChangedPackagesSequenceNumbers.get(userId);
- if (sequenceNumbers == null) {
- sequenceNumbers = new HashMap<>();
- mChangedPackagesSequenceNumbers.put(userId, sequenceNumbers);
- }
- final Integer sequenceNumber = sequenceNumbers.get(packageName);
- if (sequenceNumber != null) {
- changedPackages.remove(sequenceNumber);
- }
- changedPackages.put(mChangedPackagesSequenceNumber, packageName);
- sequenceNumbers.put(packageName, mChangedPackagesSequenceNumber);
+ mChangedPackagesSequenceNumber++;
}
- mChangedPackagesSequenceNumber++;
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index d5e2a63..ffd924e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1543,6 +1543,7 @@
}
// Link watchables to the class
+ @SuppressWarnings("GuardedBy")
private void registerObservers(boolean verify) {
// Null check to handle nullable test parameters
if (mPackages != null) {
@@ -2256,7 +2257,7 @@
@GuardedBy("mLock")
void updateInstantAppInstallerLocked(String modifiedPackage) {
- // we're only interested in updating the installer appliction when 1) it's not
+ // we're only interested in updating the installer application when 1) it's not
// already set or 2) the modified package is the installer
if (mInstantAppInstallerActivity != null
&& !mInstantAppInstallerActivity.getComponentName().getPackageName()
@@ -2740,7 +2741,6 @@
return mModuleInfoProvider.getModuleInfo(packageName, flags);
}
- @GuardedBy("mLock")
void updateSequenceNumberLP(PackageSetting pkgSetting, int[] userList) {
mChangedPackagesTracker.updateSequenceNumber(pkgSetting.getPackageName(), userList);
}
@@ -3074,8 +3074,8 @@
userId);
}
- private void enforceCanSetDistractingPackageRestrictionsAsUser(@NonNull Computer snapshot,
- int callingUid, int userId, String callingMethod) {
+ private void enforceCanSetDistractingPackageRestrictionsAsUser(int callingUid, int userId,
+ String callingMethod) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
callingMethod);
@@ -3159,6 +3159,7 @@
}
}
+ @SuppressWarnings("GuardedBy")
VersionInfo getSettingsVersionForPackage(AndroidPackage pkg) {
if (pkg.isExternalStorage()) {
if (TextUtils.isEmpty(pkg.getVolumeUuid())) {
@@ -3288,6 +3289,7 @@
* Update component enabled settings to {@link PackageManager#COMPONENT_ENABLED_STATE_DEFAULT}
* if the resetEnabledSettingsOnAppDataCleared is {@code true}.
*/
+ @GuardedBy("mLock")
private void resetComponentEnabledSettingsIfNeededLPw(String packageName, int userId) {
final AndroidPackage pkg = packageName != null ? mPackages.get(packageName) : null;
if (pkg == null || !pkg.isResetEnabledSettingsOnAppDataCleared()) {
@@ -3879,6 +3881,7 @@
}
}
+ @GuardedBy("mLock")
private boolean setEnabledSettingInternalLocked(@NonNull Computer computer,
PackageSetting pkgSetting, ComponentEnabledSetting setting, @UserIdInt int userId,
String callingPackage) {
@@ -4554,7 +4557,9 @@
final Computer snapshot = snapshotComputer();
unsuspendForSuspendingPackage(snapshot, packageName, userId);
removeAllDistractingPackageRestrictions(snapshot, userId);
- flushPackageRestrictionsAsUserInternalLocked(userId);
+ synchronized (mLock) {
+ flushPackageRestrictionsAsUserInternalLocked(userId);
+ }
}
}
if (observer != null) {
@@ -4972,6 +4977,7 @@
}
@Override
+ @SuppressWarnings("GuardedBy")
public int getRuntimePermissionsVersion(@UserIdInt int userId) {
Preconditions.checkArgumentNonnegative(userId);
enforceAdjustRuntimePermissionsPolicyOrUpgradeRuntimePermissions(
@@ -5576,7 +5582,7 @@
int restrictionFlags, int userId) {
final int callingUid = Binder.getCallingUid();
final Computer snapshot = snapshotComputer();
- enforceCanSetDistractingPackageRestrictionsAsUser(snapshot, callingUid, userId,
+ enforceCanSetDistractingPackageRestrictionsAsUser(callingUid, userId,
"setDistractingPackageRestrictionsAsUser");
Objects.requireNonNull(packageNames, "packageNames cannot be null");
return mDistractingPackageHelper.setDistractingPackageRestrictionsAsUser(snapshot,
@@ -5845,6 +5851,7 @@
}
@Override
+ @SuppressWarnings("GuardedBy")
public void setRuntimePermissionsVersion(int version, @UserIdInt int userId) {
Preconditions.checkArgumentNonnegative(version);
Preconditions.checkArgumentNonnegative(userId);
@@ -6363,6 +6370,7 @@
}
@Override
+ @SuppressWarnings("GuardedBy")
public void updateRuntimePermissionsFingerprint(@UserIdInt int userId) {
mSettings.updateRuntimePermissionsFingerprint(userId);
}
@@ -6397,6 +6405,7 @@
}
@Override
+ @SuppressWarnings("GuardedBy")
public boolean isPermissionUpgradeNeeded(int userId) {
return mSettings.isPermissionUpgradeNeeded(userId);
}