From e6c5650e88d4ffba957f1f22a0186327ba02ce86 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Fri, 13 Mar 2020 12:39:26 -0700 Subject: [PATCH] Treat MODE_FOREGROUND as ALLOWED for appop checks noteOp always resolved MODE_FOREGROUND into IGNORED/ALLOWED checkOp resolves it too, but checkOpRaw does not resolved it and might return it. Preflight checks should be independant of the uid state, hence treat MODE_FOREGROUND similar to ALLOWED as MODE_FOREGROUND might allow it. Bug: 150508177 Fixes: 148197098 Test: TH Change-Id: I7b4f53c7ce638f92747d452f2d2f72d098e94b78 --- .../java/android/content/PermissionChecker.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core/java/android/content/PermissionChecker.java b/core/java/android/content/PermissionChecker.java index 052c9209f6f7b..b4340729a2207 100644 --- a/core/java/android/content/PermissionChecker.java +++ b/core/java/android/content/PermissionChecker.java @@ -435,10 +435,11 @@ public final class PermissionChecker { final AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class); final int opMode = (forDataDelivery) ? appOpsManager.noteProxyOpNoThrow(op, packageName, uid, attributionTag, message) - : appOpsManager.unsafeCheckOpNoThrow(op, uid, packageName); + : appOpsManager.unsafeCheckOpRawNoThrow(op, uid, packageName); switch (opMode) { - case AppOpsManager.MODE_ALLOWED: { + case AppOpsManager.MODE_ALLOWED: + case AppOpsManager.MODE_FOREGROUND: { return PERMISSION_GRANTED; } case AppOpsManager.MODE_DEFAULT: { @@ -467,12 +468,14 @@ public final class PermissionChecker { final AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class); final int opMode = (forDataDelivery) ? appOpsManager.noteProxyOpNoThrow(op, packageName, uid, attributionTag, message) - : appOpsManager.unsafeCheckOpNoThrow(op, uid, packageName); + : appOpsManager.unsafeCheckOpRawNoThrow(op, uid, packageName); - if (opMode == AppOpsManager.MODE_ALLOWED) { - return PERMISSION_GRANTED; - } else { - return PERMISSION_SOFT_DENIED; + switch (opMode) { + case AppOpsManager.MODE_ALLOWED: + case AppOpsManager.MODE_FOREGROUND: + return PERMISSION_GRANTED; + default: + return PERMISSION_SOFT_DENIED; } } }