Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47942d97 authored by Steven Moreland's avatar Steven Moreland
Browse files

hwbinder: explicitly disallow local java binder

Local binders from Java are currently not supported. However, changes
which make them appear to work are planned (but which will also make
using them require unnecessary parceling). Explicitly disabling them
so that there is a clear error message instead of random errors.

Bug: 129150021
Test: boot, check logs
Test: system/tools/hidl/test/run_all_device_tests.sh
Change-Id: I107cbc768d6285b50c0eef6d41a16155d76e35dd
parent 5baeab86
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -224,6 +224,21 @@ status_t JHwBinder::onTransact(
    return err;
}

bool validateCanUseHwBinder(const sp<hardware::IBinder>& binder) {
    if (binder != nullptr && binder->localBinder() != nullptr) {
        // untested/unsupported/inefficient
        // see b/129150021, doesn't work with scatter-gather
        //
        // explicitly disabling until it is supported
        // (note, even if this is fixed to work with scatter gather, we would also need
        // to convert this to the Java object rather than re-wrapping with a proxy)
        LOG(ERROR) << "Local Java Binder not supported.";
        return false;
    }

    return true;
}

}  // namespace android

////////////////////////////////////////////////////////////////////////////////
@@ -324,9 +339,9 @@ static jobject JHwBinder_native_getService(
    sp<IBase> ret = getRawServiceInternal(ifaceName, serviceName, retry /* retry */, false /* getStub */);
    sp<hardware::IBinder> service = hardware::toBinder<hidl::base::V1_0::IBase>(ret);

    if (service == NULL) {
    if (service == nullptr || !validateCanUseHwBinder(service)) {
        signalExceptionForError(env, NAME_NOT_FOUND);
        return NULL;
        return nullptr;
    }

    LOG(INFO) << "HwBinder: Starting thread pool for getting: " << ifaceName << "/" << serviceName;
+2 −0
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@ private:

int register_android_os_HwBinder(JNIEnv *env);

bool validateCanUseHwBinder(const sp<hardware::IBinder>& binder);

}  // namespace android

#endif  // _ANDROID_OS_HW_BINDER_H
+6 −2
Original line number Diff line number Diff line
@@ -883,8 +883,12 @@ static jobject JHwParcel_native_readStrongBinder(JNIEnv *env, jobject thiz) {

    sp<hardware::IBinder> binder = parcel->readStrongBinder();

    if (binder == NULL) {
        return NULL;
    if (binder == nullptr) {
        return nullptr;
    }

    if (!validateCanUseHwBinder(binder)) {
        return nullptr;
    }

    return JHwRemoteBinder::NewObject(env, binder);