From db5100ec6f11592c24fcba7dffcb26b6756e886c Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Wed, 7 Aug 2019 17:56:58 -0700 Subject: Cleans up sharedUser regardless of creation logic Prior to this change, we were not updating the shared user a package setting belongs to if the package setting was not deep copied. In the case that shared users didn't match, we were not deep copying and so were not updating later. There is a more fundamental change to be made here, but we're limiting risk by keeping this change as small as possible. Bug: 138919405 Test: atest AppSecurityTests Test: manual; flash P then flash this build: observe consistent PackageSettings Change-Id: Ib22f9e6a1fb3104bec4eb3e5b1de983e19d49dce (cherry picked from commit cf9a4835c110b3b7c064e1dde97ffb38ef0424eb) --- .../java/com/android/server/pm/PackageManagerService.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d60fa2e5c110..7469e0994210 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -320,7 +320,6 @@ import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.pm.permission.PermissionManagerServiceInternal.PermissionCallback; import com.android.server.pm.permission.PermissionsState; import com.android.server.policy.PermissionPolicyInternal; -import com.android.server.policy.PermissionPolicyInternal.OnInitializedCallback; import com.android.server.security.VerityUtils; import com.android.server.storage.DeviceStorageMonitorInternal; import com.android.server.wm.ActivityTaskManagerInternal; @@ -11033,14 +11032,15 @@ public class PackageManagerService extends IPackageManager.Stub final String realPkgName = request.realPkgName; final List changedAbiCodePath = result.changedAbiCodePath; final PackageSetting pkgSetting; + if (request.pkgSetting != null && request.pkgSetting.sharedUser != null + && request.pkgSetting.sharedUser != result.pkgSetting.sharedUser) { + // shared user changed, remove from old shared user + request.pkgSetting.sharedUser.removePackage(request.pkgSetting); + } if (result.existingSettingCopied) { pkgSetting = request.pkgSetting; pkgSetting.updateFrom(result.pkgSetting); pkg.mExtras = pkgSetting; - if (pkgSetting.sharedUser != null - && pkgSetting.sharedUser.removePackage(result.pkgSetting)) { - pkgSetting.sharedUser.addPackage(pkgSetting); - } } else { pkgSetting = result.pkgSetting; if (originalPkgSetting != null) { @@ -11050,6 +11050,9 @@ public class PackageManagerService extends IPackageManager.Stub mTransferedPackages.add(originalPkgSetting.name); } } + if (pkgSetting.sharedUser != null) { + pkgSetting.sharedUser.addPackage(pkgSetting); + } // TODO(toddke): Consider a method specifically for modifying the Package object // post scan; or, moving this stuff out of the Package object since it has nothing // to do with the package on disk. -- cgit v1.2.3-59-g8ed1b