Handle JavaBBinderHolder not init w/ mockito

Some mockito users mocking binders like:

    doReturn(...).when(...).asBinder()

Aren't seeing this field initialized when they are making transactions
on this binder object. This causes obtain(IBinder) to fail.

Bug: 252888512
Test: ServiceStateTrackerTest
Change-Id: Ib65948b86cf91f053e26af35629aa3f7d6062c51
This commit is contained in:
Steven Moreland
2022-10-11 23:37:51 +00:00
parent f9a1e3c913
commit 2705b4102d
2 changed files with 16 additions and 1 deletions

View File

@@ -101,9 +101,18 @@ static void android_os_Parcel_markSensitive(jlong nativePtr)
static void android_os_Parcel_markForBinder(JNIEnv* env, jclass clazz, jlong nativePtr,
jobject binder)
{
LOG_ALWAYS_FATAL_IF(binder == nullptr, "Null binder specified for markForBinder");
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel) {
parcel->markForBinder(ibinderForJavaObject(env, binder));
sp<IBinder> nBinder = ibinderForJavaObject(env, binder);
if (nBinder == nullptr) {
ALOGE("Native binder in markForBinder is null for non-null jobject");
return;
}
parcel->markForBinder(nBinder);
}
}

View File

@@ -798,6 +798,12 @@ sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj)
if (env->IsInstanceOf(obj, gBinderOffsets.mClass)) {
JavaBBinderHolder* jbh = (JavaBBinderHolder*)
env->GetLongField(obj, gBinderOffsets.mObject);
if (jbh == nullptr) {
ALOGE("JavaBBinderHolder null on binder");
return nullptr;
}
return jbh->get(env, obj);
}