summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Kennedy <toddke@google.com>2018-04-04 15:00:00 -0700
committerTodd Kennedy <toddke@google.com>2018-04-04 15:00:00 -0700
commita0ec24cb624e2c6e22b696f0b38fbb442dbdb076 (patch)
tree16a68a316f8d47ad81a4fafbf8ca2fb5bc86b3f5
parent3275d9a004a45f4a2a9e30bbe7c662955ebdb9ff (diff)
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
-rw-r--r--services/core/java/com/android/server/pm/permission/BasePermission.java28
1 files changed, 17 insertions, 11 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 bcf4b07d4d26..1d002efc546f 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);
- }
- final PermissionInfo pi = new PermissionInfo();
- pi.name = name;
- pi.packageName = sourcePackageName;
- pi.nonLocalizedLabel = name;
- pi.protectionLevel = protectionLevelChanged ? adjustedProtectionLevel : protectionLevel;
- return pi;
+ 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;
+ }
+ permissionInfo = new PermissionInfo();
+ permissionInfo.name = name;
+ permissionInfo.packageName = sourcePackageName;
+ permissionInfo.nonLocalizedLabel = name;
+ permissionInfo.protectionLevel = protectionLevel;
+ return permissionInfo;
}
public static boolean readLPw(@NonNull Map<String, BasePermission> out,