Checks if AccessibilityServiceInfo is within parcelable size.

- If too large when parsing service XMLs then skip this service.
- If too large when a service attempts to update its own info
  then throw an error.

Bug: 261589597
Test: atest AccessibilityServiceInfoTest
Change-Id: Iffc0cd48cc713f7904d68059e141cb7de5a4b906
Merged-In: Iffc0cd48cc713f7904d68059e141cb7de5a4b906
This commit is contained in:
Daniel Norman
2023-02-09 12:28:26 -08:00
parent 1b0f4091fc
commit 553232c290
3 changed files with 20 additions and 0 deletions

View File

@@ -1982,6 +1982,10 @@ public abstract class AccessibilityService extends Service {
IAccessibilityServiceConnection connection = IAccessibilityServiceConnection connection =
AccessibilityInteractionClient.getInstance().getConnection(mConnectionId); AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
if (mInfo != null && connection != null) { if (mInfo != null && connection != null) {
if (!mInfo.isWithinParcelableSize()) {
throw new IllegalStateException(
"Cannot update service info: size is larger than safe parcelable limits.");
}
try { try {
connection.setServiceInfo(mInfo); connection.setServiceInfo(mInfo);
mInfo = null; mInfo = null;

View File

@@ -39,6 +39,7 @@ import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.Build; import android.os.Build;
import android.os.IBinder;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.os.RemoteException; import android.os.RemoteException;
@@ -1016,6 +1017,15 @@ public class AccessibilityServiceInfo implements Parcelable {
return 0; return 0;
} }
/** @hide */
public final boolean isWithinParcelableSize() {
final Parcel parcel = Parcel.obtain();
writeToParcel(parcel, 0);
final boolean result = parcel.dataSize() <= IBinder.MAX_IPC_SIZE;
parcel.recycle();
return result;
}
public void writeToParcel(Parcel parcel, int flagz) { public void writeToParcel(Parcel parcel, int flagz) {
parcel.writeInt(eventTypes); parcel.writeInt(eventTypes);
parcel.writeStringArray(packageNames); parcel.writeStringArray(packageNames);

View File

@@ -1353,6 +1353,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
AccessibilityServiceInfo accessibilityServiceInfo; AccessibilityServiceInfo accessibilityServiceInfo;
try { try {
accessibilityServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext); accessibilityServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext);
if (!accessibilityServiceInfo.isWithinParcelableSize()) {
Slog.e(LOG_TAG, "Skipping service "
+ accessibilityServiceInfo.getResolveInfo().getComponentInfo()
+ " because service info size is larger than safe parcelable limits.");
continue;
}
if (userState.mCrashedServices.contains(serviceInfo.getComponentName())) { if (userState.mCrashedServices.contains(serviceInfo.getComponentName())) {
// Restore the crashed attribute. // Restore the crashed attribute.
accessibilityServiceInfo.crashed = true; accessibilityServiceInfo.crashed = true;