diff options
| author | Todd Kennedy <toddke@google.com> | 2018-04-04 15:00:00 -0700 |
|---|---|---|
| committer | Todd Kennedy <toddke@google.com> | 2018-04-04 15:00:00 -0700 |
| commit | a0ec24cb624e2c6e22b696f0b38fbb442dbdb076 (patch) | |
| tree | 16a68a316f8d47ad81a4fafbf8ca2fb5bc86b3f5 | |
| parent | 3275d9a004a45f4a2a9e30bbe7c662955ebdb9ff (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.java | 28 |
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, |
