From a0ec24cb624e2c6e22b696f0b38fbb442dbdb076 Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Wed, 4 Apr 2018 15:00:00 -0700 Subject: [PATCH] Completely fill in permission info During the refactor, an optimization was made to generatePermissionInfo() to avoid creating duplicate PermissionInfo objects. However, the logic was flawed and if a permission's protection level was ever adjusted, we wouldn't return a properly filled out PermissionInfo object. Change-Id: I70b3eda199008807182f75a413651d7cb4f4b7fd Fixes: 74556457 Test: Manual; run app com.kakao.taxi and it doesn't crash --- .../server/pm/permission/BasePermission.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/pm/permission/BasePermission.java b/services/core/java/com/android/server/pm/permission/BasePermission.java index bcf4b07d4d26b..1d002efc546fd 100644 --- a/services/core/java/com/android/server/pm/permission/BasePermission.java +++ b/services/core/java/com/android/server/pm/permission/BasePermission.java @@ -411,17 +411,23 @@ public final class BasePermission { } public @NonNull PermissionInfo generatePermissionInfo(int adjustedProtectionLevel, int flags) { - final boolean protectionLevelChanged = protectionLevel != adjustedProtectionLevel; - // if we return different protection level, don't use the cached info - if (perm != null && !protectionLevelChanged) { - return PackageParser.generatePermissionInfo(perm, flags); + PermissionInfo permissionInfo; + if (perm != null) { + final boolean protectionLevelChanged = protectionLevel != adjustedProtectionLevel; + permissionInfo = PackageParser.generatePermissionInfo(perm, flags); + if (protectionLevelChanged && permissionInfo == perm.info) { + // if we return different protection level, don't use the cached info + permissionInfo = new PermissionInfo(permissionInfo); + permissionInfo.protectionLevel = adjustedProtectionLevel; + } + return permissionInfo; } - final PermissionInfo pi = new PermissionInfo(); - pi.name = name; - pi.packageName = sourcePackageName; - pi.nonLocalizedLabel = name; - pi.protectionLevel = protectionLevelChanged ? adjustedProtectionLevel : protectionLevel; - return pi; + permissionInfo = new PermissionInfo(); + permissionInfo.name = name; + permissionInfo.packageName = sourcePackageName; + permissionInfo.nonLocalizedLabel = name; + permissionInfo.protectionLevel = protectionLevel; + return permissionInfo; } public static boolean readLPw(@NonNull Map out,