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);
+ }
}
// ----------------------------------------------------------------------------