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:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user