diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 5a153ce71a429..e8f0a89930ad5 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -339,10 +339,17 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall final ProviderInfo cpi = mContext.getPackageManager() .resolveContentProvider(uri.getAuthority(), PackageManager.ComponentInfoFlags.of(PackageManager.GET_META_DATA)); + final int callingUserId = UserHandle.getUserId(callingUid); + final Uri userUri = (mSingleUser + && !UserHandle.isSameUser(mMyUid, callingUid)) + ? maybeAddUserId(uri, callingUserId) : uri; if (cpi.forceUriPermissions && mInterface.checkUriPermission(uri, callingUid, Intent.FLAG_GRANT_READ_URI_PERMISSION) - != PermissionChecker.PERMISSION_GRANTED) { + != PermissionChecker.PERMISSION_GRANTED + && getContext().checkUriPermission(userUri, Binder.getCallingPid(), + callingUid, Intent.FLAG_GRANT_READ_URI_PERMISSION) + != PackageManager.PERMISSION_GRANTED) { FrameworkStatsLog.write(GET_TYPE_ACCESSED_WITHOUT_PERMISSION, enumCheckUriPermission, callingUid, uri.getAuthority(), type); diff --git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java index 8d3c21e1e2029..33577087fa0ad 100644 --- a/services/core/java/com/android/server/am/ContentProviderHelper.java +++ b/services/core/java/com/android/server/am/ContentProviderHelper.java @@ -1121,11 +1121,15 @@ public class ContentProviderHelper { final String permissionCheck = checkContentProviderPermission(cpi, callingPid, callingUid, userId, checkUser, null); - if (permissionCheck != null) { + final boolean grantCheck = mService.checkUriPermission(uri, callingPid, callingUid, + Intent.FLAG_GRANT_READ_URI_PERMISSION , userId, null) + == PackageManager.PERMISSION_GRANTED; + + if (!grantCheck && permissionCheck != null) { FrameworkStatsLog.write(GET_TYPE_ACCESSED_WITHOUT_PERMISSION, GET_TYPE_ACCESSED_WITHOUT_PERMISSION__LOCATION__AM_FRAMEWORK_PERMISSION, callingUid, authority, type); - } else if (cpi.forceUriPermissions + } else if (!grantCheck && cpi.forceUriPermissions && holder.provider.checkUriPermission(attributionSource, uri, callingUid, Intent.FLAG_GRANT_READ_URI_PERMISSION) != PermissionChecker.PERMISSION_GRANTED) {