From dec2b233b86b29e738ba4628ef07bf408de3423a Mon Sep 17 00:00:00 2001 From: John Wu Date: Wed, 15 Sep 2021 13:51:55 -0700 Subject: [PATCH] Support leaving sharedUserId in PackageManagerService This is part 2 of ag/15290670 - Return the proper error code when sharedUserId mismatches - Update Settings.updatePackageSetting(...) to also handle the case when a package is leaving a shared UID group - In Settings.updatePackageSetting(...), update PackageSettings with new SharedUserSetting so changes will be picked up during the commit stage - Introduce new CTS test: CtsSharedUserMigrationTestCases Test: atest CtsSharedUserMigrationTestCases Bug: 179284822 Change-Id: Iaf984eed7fd45238b42020789b3b14e2dc4415be --- .../com/android/server/pm/InstallParams.java | 16 +++++++--------- .../java/com/android/server/pm/Settings.java | 9 +++++---- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/pm/InstallParams.java b/services/core/java/com/android/server/pm/InstallParams.java index 934775a9a1b54..3cf3643000df5 100644 --- a/services/core/java/com/android/server/pm/InstallParams.java +++ b/services/core/java/com/android/server/pm/InstallParams.java @@ -28,8 +28,8 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK; import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION; import static android.content.pm.PackageManager.INSTALL_FAILED_SESSION_INVALID; -import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; import static android.content.pm.PackageManager.INSTALL_FAILED_TEST_ONLY; +import static android.content.pm.PackageManager.INSTALL_FAILED_UID_CHANGED; import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_RESTORE; import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_SETUP; @@ -1202,19 +1202,17 @@ final class InstallParams extends HandlerParams { } // Check for shared user id changes - String invalidPackageName = null; if (!Objects.equals(oldPackage.getSharedUserId(), parsedPackage.getSharedUserId()) // Don't mark as invalid if the app is trying to // leave a sharedUserId && parsedPackage.getSharedUserId() != null) { - invalidPackageName = parsedPackage.getPackageName(); - } - - if (invalidPackageName != null) { - throw new PrepareFailure(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE, - "Package " + invalidPackageName + " tried to change user " - + oldPackage.getSharedUserId()); + throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED, + "Package " + parsedPackage.getPackageName() + + " shared user changed from " + + (oldPackage.getSharedUserId() != null + ? oldPackage.getSharedUserId() : "") + + " to " + parsedPackage.getSharedUserId()); } // In case of rollback, remember per-user/profile install state diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index b111bbfcb80b3..4744c96516862 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -20,7 +20,7 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE; -import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; +import static android.content.pm.PackageManager.INSTALL_FAILED_UID_CHANGED; import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY; import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN; import static android.content.pm.PackageManager.UNINSTALL_REASON_USER_TYPE; @@ -1040,14 +1040,15 @@ public final class Settings implements Watchable, Snappable { @Nullable Set mimeGroupNames, @NonNull UUID domainSetId) throws PackageManagerException { final String pkgName = pkgSetting.name; - if (pkgSetting.sharedUser != sharedUser) { + if (!Objects.equals(pkgSetting.sharedUser, sharedUser) && sharedUser != null) { PackageManagerService.reportSettingsProblem(Log.WARN, "Package " + pkgName + " shared user changed from " + (pkgSetting.sharedUser != null ? pkgSetting.sharedUser.name : "") - + " to " + (sharedUser != null ? sharedUser.name : "")); - throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE, + + " to " + sharedUser.name); + throw new PackageManagerException(INSTALL_FAILED_UID_CHANGED, "Updating application package " + pkgName + " failed"); } + pkgSetting.sharedUser = sharedUser; if (!pkgSetting.getPath().equals(codePath)) { final boolean isSystem = pkgSetting.isSystem();