From 09330c436e578e9638c73f230eb3a239af0944bf Mon Sep 17 00:00:00 2001 From: Junyu Lai Date: Mon, 20 Feb 2023 17:11:21 +0800 Subject: [PATCH] Clear calling identity before calling into DPM Test: 1. manual test with test app 2. atest CtsNetTestCases:android.net.cts.NetworkStatsManagerTest Fix: 249920382 Fix: 269561252 Change-Id: I4af7fd640d551be3ef62ea248e58bf8bae5e0b87 --- .../src/android/net/NetworkStatsAccess.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/framework-t/src/android/net/NetworkStatsAccess.java b/framework-t/src/android/net/NetworkStatsAccess.java index b64fbdba9a..0585756e7c 100644 --- a/framework-t/src/android/net/NetworkStatsAccess.java +++ b/framework-t/src/android/net/NetworkStatsAccess.java @@ -111,17 +111,18 @@ public final class NetworkStatsAccess { final DevicePolicyManager mDpm = context.getSystemService(DevicePolicyManager.class); final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - boolean hasCarrierPrivileges; - final long token = Binder.clearCallingIdentity(); + final boolean hasCarrierPrivileges; + final boolean isDeviceOwner; + long token = Binder.clearCallingIdentity(); try { hasCarrierPrivileges = tm != null && tm.checkCarrierPrivilegesForPackageAnyPhone(callingPackage) == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; + isDeviceOwner = mDpm != null && mDpm.isDeviceOwnerApp(callingPackage); } finally { Binder.restoreCallingIdentity(token); } - final boolean isDeviceOwner = mDpm != null && mDpm.isDeviceOwnerApp(callingPackage); final int appId = UserHandle.getAppId(callingUid); final boolean isNetworkStack = context.checkPermission( @@ -135,15 +136,20 @@ public final class NetworkStatsAccess { return NetworkStatsAccess.Level.DEVICE; } - boolean hasAppOpsPermission = hasAppOpsPermission(context, callingUid, callingPackage); + final boolean hasAppOpsPermission = + hasAppOpsPermission(context, callingUid, callingPackage); if (hasAppOpsPermission || context.checkCallingOrSelfPermission( READ_NETWORK_USAGE_HISTORY) == PackageManager.PERMISSION_GRANTED) { return NetworkStatsAccess.Level.DEVICESUMMARY; } - //TODO(b/169395065) Figure out if this flow makes sense in Device Owner mode. - boolean isProfileOwner = mDpm != null && (mDpm.isProfileOwnerApp(callingPackage) - || mDpm.isDeviceOwnerApp(callingPackage)); + final boolean isProfileOwner; + token = Binder.clearCallingIdentity(); + try { + isProfileOwner = mDpm != null && mDpm.isProfileOwnerApp(callingPackage); + } finally { + Binder.restoreCallingIdentity(token); + } if (isProfileOwner) { // Apps with the AppOps permission, profile owners, and apps with the privileged // permission can access data usage for all apps in this user/profile.