From ffd5864202a7c85620b7eb5032dc0120481705e5 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Mon, 29 Jun 2015 11:00:15 -0700 Subject: [PATCH] Throw DeadObjectException on failed transaction, not RuntimeException In practice we only see failed transactions with small payloads when the remote dies while the binder operation is in flight. Throw the applicable exception type rather than the generic "oops binder went haywire" one. Bug 22104446 Change-Id: I785c15617db7a1f4d505aa11f16e61551c8357ba --- core/jni/android_util_Binder.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index e2cfa440162e1..c139cd78b4c01 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -697,9 +697,11 @@ void signalExceptionForError(JNIEnv* env, jobject obj, status_t err, } else { // Heuristic: a payload smaller than this threshold "shouldn't" be too // big, so it's probably some other, more subtle problem. In practice - // it nearly always means that the remote process died while the binder + // it seems to always mean that the remote process died while the binder // transaction was already in flight. - exceptionToThrow = "java/lang/RuntimeException"; + exceptionToThrow = (canThrowRemoteException) + ? "android/os/DeadObjectException" + : "java/lang/RuntimeException"; snprintf(msg, sizeof(msg)-1, "Transaction failed on small parcel; remote process probably died"); }