From 2f379ca7d97adc1fb3249def677c1cbca57839b6 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Wed, 1 Feb 2017 09:58:00 -0800 Subject: [PATCH] Cleanup hwbinder getService code. - Remove memory leaks. - Make sure proper errors are getting thrown. - Avoid SIGABRT Test: hidl_test_java Change-Id: Ia5680fd0ebf83d0f174bf0d8109bf60327be5f9d --- core/jni/android_os_HwBinder.cpp | 38 +++++++++++++++++--------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp index e65390047c552..d35ffbba3a1e1 100644 --- a/core/jni/android_os_HwBinder.cpp +++ b/core/jni/android_os_HwBinder.cpp @@ -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> ret = manager->get(ifaceName, serviceName); - if (!ret.isOk()) { - signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */); - } - - sp 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 (!ret.isOk()) { + signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */); + return NULL; + } + + sp service = hardware::toBinder< + hidl::base::V1_0::IBase, hidl::base::V1_0::BpHwBase>(ret); + if (service == NULL) { signalExceptionForError(env, NAME_NOT_FOUND); return NULL;