Merge "Ensure Binder finalizer handles partially initialized instances."
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index 627fcbf..5182a77 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -590,9 +590,19 @@
 {
     JavaBBinderHolder* jbh = (JavaBBinderHolder*)
         env->GetIntField(clazz, gBinderOffsets.mObject);
-    env->SetIntField(clazz, gBinderOffsets.mObject, 0);
-    LOGV("Java Binder %p: removing ref on holder %p", clazz, jbh);
-    jbh->decStrong(clazz);
+    if (jbh != NULL) {
+        env->SetIntField(clazz, gBinderOffsets.mObject, 0);
+        LOGV("Java Binder %p: removing ref on holder %p", clazz, jbh);
+        jbh->decStrong(clazz);
+    } else {
+        // Encountering an uninitialized binder is harmless.  All it means is that
+        // the Binder was only partially initialized when its finalizer ran and called
+        // destroy().  The Binder could be partially initialized for several reasons.
+        // For example, a Binder subclass constructor might have thrown an exception before
+        // it could delegate to its superclass's constructor.  Consequently init() would
+        // not have been called and the holder pointer would remain NULL.
+        LOGV("Java Binder %p: ignoring uninitialized binder", clazz);
+    }
 }
 
 // ----------------------------------------------------------------------------