Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c87a3f2 authored by Patrick Baumann's avatar Patrick Baumann
Browse files

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
parent 71f6afb2
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -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,14 +2303,11 @@ 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);
                        }
                    }
                    }
                    // We may also need to apply pending (restored) runtime permission grants
                    // within these users.