From 2d6a545e3042d7cc91b54746e774681a05e0ff22 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Fri, 16 Jul 2021 17:55:20 +0000 Subject: [PATCH] Only construct real Throwable objects in AndroidFuture.readThrowable(). Bug: 186530450 Test: atest CtsSecurityTestCases:android.security.cts.AndroidFutureTest Change-Id: Icc5ce702f0cd84e9136dee3c65f63619df697358 --- .../com/android/internal/infra/AndroidFuture.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/java/com/android/internal/infra/AndroidFuture.java b/core/java/com/android/internal/infra/AndroidFuture.java index db5d06635e940..84391c1699415 100644 --- a/core/java/com/android/internal/infra/AndroidFuture.java +++ b/core/java/com/android/internal/infra/AndroidFuture.java @@ -24,6 +24,7 @@ import android.os.Looper; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; +import android.util.EventLog; import android.util.Log; import com.android.internal.annotations.GuardedBy; @@ -601,9 +602,14 @@ public class AndroidFuture extends CompletableFuture implements Parcelable String messageWithStackTrace = message + '\n' + stackTrace; Throwable throwable; try { - Class clazz = Class.forName(className); - Constructor constructor = clazz.getConstructor(String.class); - throwable = (Throwable) constructor.newInstance(messageWithStackTrace); + Class clazz = Class.forName(className, true, Parcelable.class.getClassLoader()); + if (Throwable.class.isAssignableFrom(clazz)) { + Constructor constructor = clazz.getConstructor(String.class); + throwable = (Throwable) constructor.newInstance(messageWithStackTrace); + } else { + android.util.EventLog.writeEvent(0x534e4554, "186530450", -1, ""); + throwable = new RuntimeException(className + ": " + messageWithStackTrace); + } } catch (Throwable t) { throwable = new RuntimeException(className + ": " + messageWithStackTrace); throwable.addSuppressed(t);