From 2c87a3f2bbf19bee5efe09d599503a602f64886f Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Tue, 7 Apr 2020 11:31:19 -0700 Subject: [PATCH] Skip post install if package was deleted This change skips the majority of handlePackagePostInstall if the package being handled is no longer in settings. This can happen if an uninstall is issued post commit, but before the post install steps are posted to the package handler. This will be addressed more completely in a later change. Fixes: 153131678 Bug: 153456530 Test: Device boots, installs complete without issue; this is a difficult to reproduce race condition. Change-Id: I448a6ac11f6dd6f1f30859e05ab971bae0b5d5e9 --- .../server/pm/PackageManagerService.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 90ca83e0770f5..533f8d621d67b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2072,8 +2072,18 @@ public class PackageManagerService extends IPackageManager.Stub int autoRevokePermissionsMode, boolean launchedForRestore, String installerPackage, IPackageInstallObserver2 installObserver, int dataLoaderType) { - final boolean succeeded = res.returnCode == PackageManager.INSTALL_SUCCEEDED; + boolean succeeded = res.returnCode == PackageManager.INSTALL_SUCCEEDED; final boolean update = res.removedInfo != null && res.removedInfo.removedPackage != null; + final String packageName = res.name; + final PackageSetting pkgSetting = succeeded ? getPackageSetting(packageName) : null; + if (succeeded && pkgSetting == null) { + Slog.e(TAG, packageName + " was removed before handlePackagePostInstall " + + "could be executed"); + res.returnCode = INSTALL_FAILED_PACKAGE_CHANGED; + res.returnMsg = "Package was removed before install could complete."; + notifyInstallObserver(res, installObserver); + return; + } if (succeeded) { // Send the removed broadcasts @@ -2117,8 +2127,6 @@ public class PackageManagerService extends IPackageManager.Stub mInstantAppRegistry.onPackageInstalledLPw(res.pkg, res.newUsers); } - final String packageName = res.pkg.getPackageName(); - // Determine the set of users who are adding this package for // the first time vs. those who are seeing an update. int[] firstUserIds = EMPTY_INT_ARRAY; @@ -2126,7 +2134,7 @@ public class PackageManagerService extends IPackageManager.Stub int[] updateUserIds = EMPTY_INT_ARRAY; int[] instantUserIds = EMPTY_INT_ARRAY; final boolean allNewUsers = res.origUsers == null || res.origUsers.length == 0; - final PackageSetting ps = getPackageSetting(res.pkg.getPackageName()); + final PackageSetting ps = pkgSetting; for (int newUser : res.newUsers) { final boolean isInstantApp = ps.getInstantApp(newUser); if (allNewUsers) { @@ -2263,7 +2271,7 @@ public class PackageManagerService extends IPackageManager.Stub if (packageExternalStorageType != StorageEnums.UNKNOWN) { FrameworkStatsLog.write( FrameworkStatsLog.APP_INSTALL_ON_EXTERNAL_STORAGE_REPORTED, - packageExternalStorageType, res.pkg.getPackageName()); + packageExternalStorageType, packageName); } } if (DEBUG_INSTALL) { @@ -2295,12 +2303,9 @@ public class PackageManagerService extends IPackageManager.Stub if (packageIsBrowser(packageName, userId)) { // If this browser is restored from user's backup, do not clear // default-browser state for this user - synchronized (mLock) { - final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); - if (pkgSetting.getInstallReason(userId) - != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { - mPermissionManager.setDefaultBrowser(null, true, true, userId); - } + if (pkgSetting.getInstallReason(userId) + != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { + mPermissionManager.setDefaultBrowser(null, true, true, userId); } }