diff options
| -rw-r--r-- | core/java/android/content/ContentProvider.java | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 87fb84331af3..c25b5e874ab0 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -61,6 +61,7 @@ import android.os.storage.StorageManager; import android.permission.PermissionCheckerManager; import android.provider.MediaStore; import android.text.TextUtils; +import android.util.ArraySet; import android.util.Log; import android.util.SparseBooleanArray; @@ -486,6 +487,8 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall validateIncomingAuthority(authority); int numOperations = operations.size(); final int[] userIds = new int[numOperations]; + final ArraySet<String> readPermissions = new ArraySet<String>(); + final ArraySet<String> writePermissions = new ArraySet<String>(); for (int i = 0; i < numOperations; i++) { ContentProviderOperation operation = operations.get(i); Uri uri = operation.getUri(); @@ -499,17 +502,19 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall } final AttributionSource accessAttributionSource = attributionSource; - if (operation.isReadOperation()) { + if (operation.isReadOperation() && !readPermissions.contains(uri.toString())) { if (enforceReadPermission(accessAttributionSource, uri) != PermissionChecker.PERMISSION_GRANTED) { throw new OperationApplicationException("App op not allowed", 0); } + readPermissions.add(uri.toString()); } - if (operation.isWriteOperation()) { + if (operation.isWriteOperation() && !writePermissions.contains(uri.toString())) { if (enforceWritePermission(accessAttributionSource, uri) != PermissionChecker.PERMISSION_GRANTED) { throw new OperationApplicationException("App op not allowed", 0); } + writePermissions.add(uri.toString()); } } traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "applyBatch: ", authority); |