From 416a04e4c6e9fc876b0c35562967e933ac98046e Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Fri, 26 Feb 2021 10:28:34 -0800 Subject: [PATCH] Fix permission state missing when backup is restored. The BackupAgent of an application may run before package post installation, so the permission state must be ready by then. So instead of calling onPackageInstalled() in post install, we can revert to calling it in updateSettingsInternalLI() as in R (before ag/13144022 which introduced the regression). This changes the grant permissions etc to be done before package post-installation, but this might be actually a correct change as application code may expect permissions, and we are already doing it like this in installExistingPackageAsUser() so this change is making it consistent. Fixes: 175932103 Test: manual Test: Wipe and restore a backup and ensure Keep is no longer crashing. Test: presubmit Change-Id: Ie2e0dbd7a1a8454f9935527b9c303c26010ff592 --- .../server/pm/PackageManagerService.java | 74 +++++++++---------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 8123951eadff0..b514899f622f0 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5092,23 +5092,12 @@ public class PackageManagerService extends IPackageManager.Stub InstallArgs args = data.args; PackageInstalledInfo parentRes = data.res; - final boolean grantPermissions = (args.installFlags - & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0; final boolean killApp = (args.installFlags & PackageManager.INSTALL_DONT_KILL_APP) == 0; final boolean virtualPreload = ((args.installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0); - final String[] grantedPermissions = args.installGrantPermissions; - final List whitelistedRestrictedPermissions = ((args.installFlags - & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0 - && parentRes.pkg != null) - ? parentRes.pkg.getRequestedPermissions() - : args.whitelistedRestrictedPermissions; - int autoRevokePermissionsMode = args.autoRevokePermissionsMode; - handlePackagePostInstall(parentRes, grantPermissions, - killApp, virtualPreload, grantedPermissions, - whitelistedRestrictedPermissions, autoRevokePermissionsMode, + handlePackagePostInstall(parentRes, killApp, virtualPreload, didRestore, args.installSource.installerPackageName, args.observer, args.mDataLoaderType); @@ -5387,11 +5376,8 @@ public class PackageManagerService extends IPackageManager.Stub } } - private void handlePackagePostInstall(PackageInstalledInfo res, boolean grantPermissions, - boolean killApp, boolean virtualPreload, - String[] grantedPermissions, List allowlistedRestrictedPermissions, - int autoRevokePermissionsMode, - boolean launchedForRestore, String installerPackage, + private void handlePackagePostInstall(PackageInstalledInfo res, boolean killApp, + boolean virtualPreload, boolean launchedForRestore, String installerPackage, IPackageInstallObserver2 installObserver, int dataLoaderType) { boolean succeeded = res.returnCode == PackageManager.INSTALL_SUCCEEDED; final boolean update = res.removedInfo != null && res.removedInfo.removedPackage != null; @@ -5422,29 +5408,6 @@ public class PackageManagerService extends IPackageManager.Stub res.removedInfo.sendPackageRemovedBroadcasts(killApp, false /*removedBySystem*/); } - final PermissionManagerServiceInternal.PackageInstalledParams.Builder - permissionParamsBuilder = - new PermissionManagerServiceInternal.PackageInstalledParams.Builder(); - final List grantedPermissionsList; - if (grantPermissions) { - if (grantedPermissions != null) { - permissionParamsBuilder.setGrantedPermissions(Arrays.asList( - grantedPermissions)); - } else { - permissionParamsBuilder.setGrantedPermissions( - res.pkg.getRequestedPermissions()); - } - } - if (allowlistedRestrictedPermissions != null) { - permissionParamsBuilder.setAllowlistedRestrictedPermissions( - allowlistedRestrictedPermissions); - } - permissionParamsBuilder.setAutoRevokePermissionsMode(autoRevokePermissionsMode); - for (final int userId : res.newUsers) { - mPermissionManager.onPackageInstalled(res.pkg, permissionParamsBuilder.build(), - userId); - } - final String installerPackageName = res.installerPackageName != null ? res.installerPackageName @@ -18445,6 +18408,37 @@ public class PackageManagerService extends IPackageManager.Stub } mSettings.writeKernelMappingLPr(ps); + + final PermissionManagerServiceInternal.PackageInstalledParams.Builder + permissionParamsBuilder = + new PermissionManagerServiceInternal.PackageInstalledParams.Builder(); + final boolean grantPermissions = (installArgs.installFlags + & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0; + if (grantPermissions) { + final List grantedPermissions = + installArgs.installGrantPermissions != null + ? Arrays.asList(installArgs.installGrantPermissions) + : pkg.getRequestedPermissions(); + permissionParamsBuilder.setGrantedPermissions(grantedPermissions); + } + final boolean allowlistAllRestrictedPermissions = + (installArgs.installFlags + & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0; + final List allowlistedRestrictedPermissions = + allowlistAllRestrictedPermissions ? pkg.getRequestedPermissions() + : installArgs.whitelistedRestrictedPermissions; + if (allowlistedRestrictedPermissions != null) { + permissionParamsBuilder.setAllowlistedRestrictedPermissions( + allowlistedRestrictedPermissions); + } + final int autoRevokePermissionsMode = installArgs.autoRevokePermissionsMode; + permissionParamsBuilder.setAutoRevokePermissionsMode(autoRevokePermissionsMode); + for (int currentUserId : allUsersList) { + if (ps.getInstalled(currentUserId)) { + mPermissionManager.onPackageInstalled(pkg, permissionParamsBuilder.build(), + currentUserId); + } + } } res.name = pkgName; res.uid = pkg.getUid();