From 9f0268695c046538a1887f54172454dbc89157e7 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 3 Nov 2016 15:46:04 -0700 Subject: [PATCH] Fix use of JNI calls inside GetStringCritical/ReleaseStringCritical sections. Test: make, hidl_test_java Bug: 32670143 Change-Id: Ia987a26fceab41cfc18fbae7c83e01dff1d9d11a --- core/jni/android_os_HwParcel.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp index 7387b294bbcde..886c0e6771f44 100644 --- a/core/jni/android_os_HwParcel.cpp +++ b/core/jni/android_os_HwParcel.cpp @@ -267,17 +267,17 @@ static void JHwParcel_native_writeInterfaceToken( const jchar *interfaceName = env->GetStringCritical(interfaceNameObj, NULL); if (interfaceName) { - hardware::Parcel *parcel = - JHwParcel::GetNativeContext(env, thiz)->getParcel(); - - status_t err = parcel->writeInterfaceToken( - String16( - reinterpret_cast(interfaceName), - env->GetStringLength(interfaceNameObj))); + String16 nameCopy( + reinterpret_cast(interfaceName), + env->GetStringLength(interfaceNameObj)); env->ReleaseStringCritical(interfaceNameObj, interfaceName); interfaceName = NULL; + hardware::Parcel *parcel = + JHwParcel::GetNativeContext(env, thiz)->getParcel(); + + status_t err = parcel->writeInterfaceToken(nameCopy); signalExceptionForError(env, err); } } @@ -294,17 +294,18 @@ static void JHwParcel_native_enforceInterface( const jchar *interfaceName = env->GetStringCritical(interfaceNameObj, NULL); if (interfaceName) { - hardware::Parcel *parcel = - JHwParcel::GetNativeContext(env, thiz)->getParcel(); - - bool valid = parcel->enforceInterface( - String16( - reinterpret_cast(interfaceName), - env->GetStringLength(interfaceNameObj))); + String16 interfaceNameCopy( + reinterpret_cast(interfaceName), + env->GetStringLength(interfaceNameObj)); env->ReleaseStringCritical(interfaceNameObj, interfaceName); interfaceName = NULL; + hardware::Parcel *parcel = + JHwParcel::GetNativeContext(env, thiz)->getParcel(); + + bool valid = parcel->enforceInterface(interfaceNameCopy); + if (!valid) { jniThrowException( env,