From d08c0ec7403fce314ed0b0d04a1b0976b56cb852 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Thu, 11 May 2023 11:23:27 -0700 Subject: Always send result code to IntentSender, if present. Bug: 276185613 Fixes: 276185613 Test: atest CtsPackageInstallTestCases Change-Id: Ic3bc9acbab68fa5f0dce6e11cd718973a4c53406 --- .../android/server/pm/InstallPackageHelper.java | 23 ++++++++++++---------- .../android/server/pm/PackageInstallerService.java | 11 +++++++++-- .../android/server/pm/PackageManagerService.java | 2 +- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index f3d5f6e84113..0f434803ee4b 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -613,8 +613,8 @@ final class InstallPackageHelper { Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } - public int installExistingPackageAsUser(@Nullable String packageName, @UserIdInt int userId, - @PackageManager.InstallFlags int installFlags, + public Pair installExistingPackageAsUser(@Nullable String packageName, + @UserIdInt int userId, @PackageManager.InstallFlags int installFlags, @PackageManager.InstallReason int installReason, @Nullable List allowlistedRestrictedPermissions, @Nullable IntentSender intentSender) { @@ -639,7 +639,7 @@ final class InstallPackageHelper { true /* requireFullPermission */, true /* checkShell */, "installExistingPackage for user " + userId); if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) { - return PackageManager.INSTALL_FAILED_USER_RESTRICTED; + return Pair.create(PackageManager.INSTALL_FAILED_USER_RESTRICTED, intentSender); } final long callingId = Binder.clearCallingIdentity(); @@ -655,7 +655,7 @@ final class InstallPackageHelper { final Computer snapshot = mPm.snapshotComputer(); pkgSetting = mPm.mSettings.getPackageLPr(packageName); if (pkgSetting == null || pkgSetting.getPkg() == null) { - return PackageManager.INSTALL_FAILED_INVALID_URI; + return Pair.create(PackageManager.INSTALL_FAILED_INVALID_URI, intentSender); } if (!snapshot.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) { // only allow the existing package to be used if it's installed as a full @@ -668,7 +668,7 @@ final class InstallPackageHelper { } } if (!installAllowed) { - return PackageManager.INSTALL_FAILED_INVALID_URI; + return Pair.create(PackageManager.INSTALL_FAILED_INVALID_URI, intentSender); } } if (!pkgSetting.getInstalled(userId)) { @@ -726,14 +726,17 @@ final class InstallPackageHelper { } // start async restore with no post-install since we finish install here + final IntentSender onCompleteSender = intentSender; + intentSender = null; + InstallRequest request = new InstallRequest(userId, PackageManager.INSTALL_SUCCEEDED, pkgSetting.getPkg(), new int[]{ userId }, () -> { mPm.restorePermissionsAndUpdateRolesForNewUserInstall(packageName, userId); - if (intentSender != null) { - onRestoreComplete(PackageManager.INSTALL_SUCCEEDED, mContext, - intentSender); + if (onCompleteSender != null) { + onInstallComplete(PackageManager.INSTALL_SUCCEEDED, mContext, + onCompleteSender); } }); restoreAndPostInstall(request); @@ -742,10 +745,10 @@ final class InstallPackageHelper { Binder.restoreCallingIdentity(callingId); } - return PackageManager.INSTALL_SUCCEEDED; + return Pair.create(PackageManager.INSTALL_SUCCEEDED, intentSender); } - private static void onRestoreComplete(int returnCode, Context context, IntentSender target) { + static void onInstallComplete(int returnCode, Context context, IntentSender target) { Intent fillIn = new Intent(); fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageManager.installStatusToPublicStatus(returnCode)); diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index e8bf82fb80b4..a18d5082e5f1 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -1292,8 +1292,15 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements public void installExistingPackage(String packageName, int installFlags, int installReason, IntentSender statusReceiver, int userId, List allowListedPermissions) { final InstallPackageHelper installPackageHelper = new InstallPackageHelper(mPm); - installPackageHelper.installExistingPackageAsUser(packageName, userId, installFlags, - installReason, allowListedPermissions, statusReceiver); + + var result = installPackageHelper.installExistingPackageAsUser(packageName, userId, + installFlags, installReason, allowListedPermissions, statusReceiver); + + int returnCode = result.first; + IntentSender onCompleteSender = result.second; + if (onCompleteSender != null) { + InstallPackageHelper.onInstallComplete(returnCode, mContext, onCompleteSender); + } } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 4ddc7e4b44ee..818d973a3809 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5342,7 +5342,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService public int installExistingPackageAsUser(String packageName, int userId, int installFlags, int installReason, List whiteListedPermissions) { return mInstallPackageHelper.installExistingPackageAsUser(packageName, userId, installFlags, - installReason, whiteListedPermissions, null); + installReason, whiteListedPermissions, null).first; } @Override -- cgit v1.2.3-59-g8ed1b