From d71c0ce305f50cc16c431862e3401dfc27b8e984 Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Wed, 23 Mar 2022 14:26:51 +0000 Subject: [PATCH] device policy: ignore unknown permission in setPermissionGrantState When setting a permission grant on a non-existent permission, implementation currently throws RemoteException but that's not propagated across binder causing the client cide to stuck until the timeout. Replace this with an immediate fail. Bug: 197200931 Test: manual with TestDPC Change-Id: I9a0ea42e52d68259eb0464194a5a1d9fbfc2a216 --- .../DevicePolicyManagerService.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 55e504a3b6117..acbad8ef370e0 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -13986,16 +13986,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return; } } - try { - if (!isRuntimePermission(permission)) { - callback.sendResult(null); - return; - } - } catch (NameNotFoundException e) { - throw new RemoteException("Cannot check if " + permission - + "is a runtime permission", e, false, true); + if (!isRuntimePermission(permission)) { + callback.sendResult(null); + return; } - if (grantState == DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED || grantState == DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED || grantState == DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT) { @@ -14108,11 +14102,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { }); } - public boolean isRuntimePermission(String permissionName) throws NameNotFoundException { - final PackageManager packageManager = mInjector.getPackageManager(); - PermissionInfo permissionInfo = packageManager.getPermissionInfo(permissionName, 0); - return (permissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) - == PermissionInfo.PROTECTION_DANGEROUS; + private boolean isRuntimePermission(String permissionName) { + try { + final PackageManager packageManager = mInjector.getPackageManager(); + PermissionInfo permissionInfo = packageManager.getPermissionInfo(permissionName, 0); + return (permissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) + == PermissionInfo.PROTECTION_DANGEROUS; + } catch (NameNotFoundException e) { + return false; + } } @Override