OSDN Git Service

Throw DeadObjectException on failed transaction, not RuntimeException
authorChristopher Tate <ctate@google.com>
Mon, 29 Jun 2015 18:00:15 +0000 (11:00 -0700)
committerChristopher Tate <ctate@google.com>
Mon, 29 Jun 2015 18:52:23 +0000 (11:52 -0700)
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

index e2cfa44..c139cd7 100644 (file)
@@ -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");
             }