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

Commit 2f379ca7 authored by Steven Moreland's avatar Steven Moreland
Browse files

Cleanup hwbinder getService code.

- Remove memory leaks.
- Make sure proper errors are getting thrown.
- Avoid SIGABRT

Test: hidl_test_java
Change-Id: Ia5680fd0ebf83d0f174bf0d8109bf60327be5f9d
parent 53873df5
Loading
Loading
Loading
Loading
+18 −16
Original line number Diff line number Diff line
@@ -302,6 +302,14 @@ static jobject JHwBinder_native_getService(
        return NULL;
    }

    auto manager = hardware::defaultServiceManager();

    if (manager == nullptr) {
        LOG(ERROR) << "Could not get hwservicemanager.";
        signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);
        return NULL;
    }

    const char *ifaceName = env->GetStringUTFChars(ifaceNameObj, NULL);
    if (ifaceName == NULL) {
        return NULL; // XXX exception already pending?
@@ -312,32 +320,26 @@ static jobject JHwBinder_native_getService(
        return NULL; // XXX exception already pending?
    }

    LOG(INFO) << "looking for service '"
              << serviceName
              << "'";

    auto manager = hardware::defaultServiceManager();

    if (manager == nullptr) {
        LOG(ERROR) << "Could not get hwservicemanager.";
        signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);
        return NULL;
    }
    LOG(INFO) << "Looking for service "
              << ifaceName
              << "/"
              << serviceName;

    Return<sp<hidl::base::V1_0::IBase>> ret = manager->get(ifaceName, serviceName);

    env->ReleaseStringUTFChars(ifaceNameObj, ifaceName);
    ifaceName = NULL;
    env->ReleaseStringUTFChars(serviceNameObj, serviceName);
    serviceName = NULL;

    if (!ret.isOk()) {
        signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);
        return NULL;
    }

    sp<hardware::IBinder> service = hardware::toBinder<
            hidl::base::V1_0::IBase, hidl::base::V1_0::BpHwBase>(ret);

    env->ReleaseStringUTFChars(ifaceNameObj, ifaceName);
    ifaceName = NULL;
    env->ReleaseStringUTFChars(serviceNameObj, serviceName);
    serviceName = NULL;

    if (service == NULL) {
        signalExceptionForError(env, NAME_NOT_FOUND);
        return NULL;