fixes a security vulnerability in slice provider
Bug: 138441555
Test: Manual
Change-Id: Ib1b4fba54ebd3599fe11021d21dc9b09d34e8965
Merged-In: Ib1b4fba54ebd3599fe11021d21dc9b09d34e8965
(cherry picked from commit 2b415a4c44)
This commit is contained in:
@@ -355,7 +355,8 @@ public abstract class SliceProvider extends ContentProvider {
|
||||
@Override
|
||||
public Bundle call(String method, String arg, Bundle extras) {
|
||||
if (method.equals(METHOD_SLICE)) {
|
||||
Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_BIND_URI));
|
||||
Uri uri = getUriWithoutUserId(validateIncomingUriOrNull(
|
||||
extras.getParcelable(EXTRA_BIND_URI)));
|
||||
List<SliceSpec> supportedSpecs = extras.getParcelableArrayList(EXTRA_SUPPORTED_SPECS);
|
||||
|
||||
String callingPackage = getCallingPackage();
|
||||
@@ -369,7 +370,7 @@ public abstract class SliceProvider extends ContentProvider {
|
||||
} else if (method.equals(METHOD_MAP_INTENT)) {
|
||||
Intent intent = extras.getParcelable(EXTRA_INTENT);
|
||||
if (intent == null) return null;
|
||||
Uri uri = onMapIntentToUri(intent);
|
||||
Uri uri = validateIncomingUriOrNull(onMapIntentToUri(intent));
|
||||
List<SliceSpec> supportedSpecs = extras.getParcelableArrayList(EXTRA_SUPPORTED_SPECS);
|
||||
Bundle b = new Bundle();
|
||||
if (uri != null) {
|
||||
@@ -383,24 +384,27 @@ public abstract class SliceProvider extends ContentProvider {
|
||||
} else if (method.equals(METHOD_MAP_ONLY_INTENT)) {
|
||||
Intent intent = extras.getParcelable(EXTRA_INTENT);
|
||||
if (intent == null) return null;
|
||||
Uri uri = onMapIntentToUri(intent);
|
||||
Uri uri = validateIncomingUriOrNull(onMapIntentToUri(intent));
|
||||
Bundle b = new Bundle();
|
||||
b.putParcelable(EXTRA_SLICE, uri);
|
||||
return b;
|
||||
} else if (method.equals(METHOD_PIN)) {
|
||||
Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_BIND_URI));
|
||||
Uri uri = getUriWithoutUserId(validateIncomingUriOrNull(
|
||||
extras.getParcelable(EXTRA_BIND_URI)));
|
||||
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
|
||||
throw new SecurityException("Only the system can pin/unpin slices");
|
||||
}
|
||||
handlePinSlice(uri);
|
||||
} else if (method.equals(METHOD_UNPIN)) {
|
||||
Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_BIND_URI));
|
||||
Uri uri = getUriWithoutUserId(validateIncomingUriOrNull(
|
||||
extras.getParcelable(EXTRA_BIND_URI)));
|
||||
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
|
||||
throw new SecurityException("Only the system can pin/unpin slices");
|
||||
}
|
||||
handleUnpinSlice(uri);
|
||||
} else if (method.equals(METHOD_GET_DESCENDANTS)) {
|
||||
Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_BIND_URI));
|
||||
Uri uri = getUriWithoutUserId(
|
||||
validateIncomingUriOrNull(extras.getParcelable(EXTRA_BIND_URI)));
|
||||
Bundle b = new Bundle();
|
||||
b.putParcelableArrayList(EXTRA_SLICE_DESCENDANTS,
|
||||
new ArrayList<>(handleGetDescendants(uri)));
|
||||
@@ -416,6 +420,10 @@ public abstract class SliceProvider extends ContentProvider {
|
||||
return super.call(method, arg, extras);
|
||||
}
|
||||
|
||||
private Uri validateIncomingUriOrNull(Uri uri) {
|
||||
return uri == null ? null : validateIncomingUri(uri);
|
||||
}
|
||||
|
||||
private Collection<Uri> handleGetDescendants(Uri uri) {
|
||||
mCallback = "onGetSliceDescendants";
|
||||
return onGetSliceDescendants(uri);
|
||||
|
||||
Reference in New Issue
Block a user