Validate user-supplied tree URIs in DocumentsProvider calls am: eca247f2d3

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12513169

Change-Id: Ibc90fe5e176678bf3a10e5a876e3a5da772302ee
This commit is contained in:
Abhijeet Kaur
2020-10-06 14:00:53 +00:00
committed by Automerger Merge Worker

View File

@@ -218,8 +218,15 @@ public abstract class DocumentsProvider extends ContentProvider {
} }
/** {@hide} */ /** {@hide} */
private void enforceTree(Uri documentUri) { private void enforceTreeForExtraUris(Bundle extras) {
if (isTreeUri(documentUri)) { enforceTree(extras.getParcelable(DocumentsContract.EXTRA_URI));
enforceTree(extras.getParcelable(DocumentsContract.EXTRA_PARENT_URI));
enforceTree(extras.getParcelable(DocumentsContract.EXTRA_TARGET_URI));
}
/** {@hide} */
private void enforceTree(@Nullable Uri documentUri) {
if (documentUri != null && isTreeUri(documentUri)) {
final String parent = getTreeDocumentId(documentUri); final String parent = getTreeDocumentId(documentUri);
final String child = getDocumentId(documentUri); final String child = getDocumentId(documentUri);
if (Objects.equals(parent, child)) { if (Objects.equals(parent, child)) {
@@ -1080,6 +1087,9 @@ public abstract class DocumentsProvider extends ContentProvider {
final Context context = getContext(); final Context context = getContext();
final Bundle out = new Bundle(); final Bundle out = new Bundle();
// If the URI is a tree URI performs some validation.
enforceTreeForExtraUris(extras);
final Uri extraUri = validateIncomingNullableUri( final Uri extraUri = validateIncomingNullableUri(
extras.getParcelable(DocumentsContract.EXTRA_URI)); extras.getParcelable(DocumentsContract.EXTRA_URI));
final Uri extraTargetUri = validateIncomingNullableUri( final Uri extraTargetUri = validateIncomingNullableUri(
@@ -1110,9 +1120,6 @@ public abstract class DocumentsProvider extends ContentProvider {
"Requested authority " + authority + " doesn't match provider " + mAuthority); "Requested authority " + authority + " doesn't match provider " + mAuthority);
} }
// If the URI is a tree URI performs some validation.
enforceTree(documentUri);
if (METHOD_IS_CHILD_DOCUMENT.equals(method)) { if (METHOD_IS_CHILD_DOCUMENT.equals(method)) {
enforceReadPermissionInner(documentUri, getCallingPackage(), enforceReadPermissionInner(documentUri, getCallingPackage(),
getCallingAttributionTag(), null); getCallingAttributionTag(), null);