Skip to content

Commit 65c358f

Browse files
Daniel-NormanAndroid Build Coastguard Worker
authored andcommitted
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 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:553232c29079fbeab28f95307d025c1426aa7142) Merged-In: Iffc0cd48cc713f7904d68059e141cb7de5a4b906 Change-Id: Iffc0cd48cc713f7904d68059e141cb7de5a4b906
1 parent ce3d276 commit 65c358f

3 files changed

Lines changed: 20 additions & 0 deletions

File tree

core/java/android/accessibilityservice/AccessibilityService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2523,6 +2523,10 @@ private void sendServiceInfo() {
25232523
IAccessibilityServiceConnection connection =
25242524
AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
25252525
if (mInfo != null && connection != null) {
2526+
if (!mInfo.isWithinParcelableSize()) {
2527+
throw new IllegalStateException(
2528+
"Cannot update service info: size is larger than safe parcelable limits.");
2529+
}
25262530
try {
25272531
connection.setServiceInfo(mInfo);
25282532
mInfo = null;

core/java/android/accessibilityservice/AccessibilityServiceInfo.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import android.graphics.drawable.Drawable;
4141
import android.hardware.fingerprint.FingerprintManager;
4242
import android.os.Build;
43+
import android.os.IBinder;
4344
import android.os.Parcel;
4445
import android.os.Parcelable;
4546
import android.os.RemoteException;
@@ -1128,6 +1129,15 @@ public int describeContents() {
11281129
return 0;
11291130
}
11301131

1132+
/** @hide */
1133+
public final boolean isWithinParcelableSize() {
1134+
final Parcel parcel = Parcel.obtain();
1135+
writeToParcel(parcel, 0);
1136+
final boolean result = parcel.dataSize() <= IBinder.MAX_IPC_SIZE;
1137+
parcel.recycle();
1138+
return result;
1139+
}
1140+
11311141
public void writeToParcel(Parcel parcel, int flagz) {
11321142
parcel.writeInt(eventTypes);
11331143
parcel.writeStringArray(packageNames);

services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,6 +1848,12 @@ private boolean readInstalledAccessibilityServiceLocked(AccessibilityUserState u
18481848
AccessibilityServiceInfo accessibilityServiceInfo;
18491849
try {
18501850
accessibilityServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext);
1851+
if (!accessibilityServiceInfo.isWithinParcelableSize()) {
1852+
Slog.e(LOG_TAG, "Skipping service "
1853+
+ accessibilityServiceInfo.getResolveInfo().getComponentInfo()
1854+
+ " because service info size is larger than safe parcelable limits.");
1855+
continue;
1856+
}
18511857
if (userState.mCrashedServices.contains(serviceInfo.getComponentName())) {
18521858
// Restore the crashed attribute.
18531859
accessibilityServiceInfo.crashed = true;

0 commit comments

Comments
 (0)