F-12681: release JNI local references in the ATOMIC_USER callbacks

pull/411/head
Chris Conlon 2026-09-01 10:46:17 -06:00
parent a146a962cb
commit 36f19df3bb
1 changed files with 228 additions and 97 deletions

View File

@ -2459,6 +2459,48 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLContext_setVerifyDecryptCb
#ifdef ATOMIC_USER
/* Delete JNI local references created inside NativeMacEncryptCb() */
static void freeMacEncryptCbLocalRefs(JNIEnv* jenv, jclass excClass,
jclass sessClass, jobject ctxRef, jclass innerCtxClass, jobject macOutBB,
jbyteArray j_macIn, jobject encOutBB, jobject encInBB)
{
if (jenv == NULL) {
return;
}
if (macOutBB != NULL) {
(*jenv)->DeleteLocalRef(jenv, macOutBB);
}
if (j_macIn != NULL) {
(*jenv)->DeleteLocalRef(jenv, j_macIn);
}
if (encOutBB != NULL) {
(*jenv)->DeleteLocalRef(jenv, encOutBB);
}
if (encInBB != NULL) {
(*jenv)->DeleteLocalRef(jenv, encInBB);
}
if (innerCtxClass != NULL) {
(*jenv)->DeleteLocalRef(jenv, innerCtxClass);
}
if (ctxRef != NULL) {
(*jenv)->DeleteLocalRef(jenv, ctxRef);
}
if (sessClass != NULL) {
(*jenv)->DeleteLocalRef(jenv, sessClass);
}
if (excClass != NULL) {
(*jenv)->DeleteLocalRef(jenv, excClass);
}
}
int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
const unsigned char* macIn, unsigned int macInSz, int macContent,
int macVerify, unsigned char* encOut, const unsigned char* encIn,
@ -2468,16 +2510,16 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
jint vmret = 0;
JNIEnv* jenv; /* JNI environment */
jclass excClass; /* WolfSSLJNIException class */
jclass excClass = NULL; /* WolfSSLJNIException class */
int needsDetach = 0; /* Should we explicitly detach? */
jobject* g_cachedSSLObj; /* WolfSSLSession cached object */
jclass sessClass; /* WolfSSLSession class */
jclass sessClass = NULL; /* WolfSSLSession class */
jfieldID ctxFid; /* WolfSSLSession->ctx FieldID */
jmethodID getCtxMethodId; /* WolfSSLSession->getAssCtxPtr() ID */
jobject ctxRef; /* WolfSSLContext object */
jclass innerCtxClass; /* WolfSSLContext class */
jobject ctxRef = NULL; /* WolfSSLContext object */
jclass innerCtxClass = NULL; /* WolfSSLContext class */
jmethodID macEncryptMethodId; /* internalMacEncryptCallback ID */
jobject macOutBB = NULL;
@ -2485,7 +2527,7 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
jobject encInBB = NULL;
int hmacSize;
jbyteArray j_macIn;
jbyteArray j_macIn = NULL;
(void)ctx;
@ -2514,6 +2556,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2525,6 +2569,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLSession object reference in "
"NativeMacEncryptCb");
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2536,6 +2582,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLSession class reference in "
"NativeMacEncryptCb");
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2552,6 +2600,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLContext field ID in "
"NativeMacEncryptCb");
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2569,6 +2619,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get getAssociatedContextPtr() method ID in "
"NativeMacEncryptCb");
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2582,6 +2634,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
if (!ctxRef) {
(*jenv)->ThrowNew(jenv, excClass,
"Can't get WolfSSLContext object in NativeMacEncryptCb");
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2593,7 +2647,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLContext class reference in "
"NativeMacEncryptCb");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2612,7 +2667,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
}
(*jenv)->ThrowNew(jenv, excClass,
"Error getting internalMacEncryptCallback method from JNI");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2627,7 +2683,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
if (!macOutBB) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create macOut ByteBuffer");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2638,8 +2695,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
if (!j_macIn) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create macIn ByteBuffer");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, macOutBB);
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2650,9 +2707,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, macOutBB);
(*jenv)->DeleteLocalRef(jenv, j_macIn);
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2663,9 +2719,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
if (!encOutBB) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create encOut ByteBuffer");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, macOutBB);
(*jenv)->DeleteLocalRef(jenv, j_macIn);
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2679,10 +2734,8 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
if (!encInBB) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create encIn ByteBuffer");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, macOutBB);
(*jenv)->DeleteLocalRef(jenv, j_macIn);
(*jenv)->DeleteLocalRef(jenv, encOutBB);
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2698,31 +2751,61 @@ int NativeMacEncryptCb(WOLFSSL* ssl, unsigned char* macOut,
(*jenv)->ExceptionClear(jenv);
(*jenv)->ThrowNew(jenv, excClass,
"Call to Java callback failed in NativeMacEncryptCb");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, macOutBB);
(*jenv)->DeleteLocalRef(jenv, j_macIn);
(*jenv)->DeleteLocalRef(jenv, encOutBB);
(*jenv)->DeleteLocalRef(jenv, encInBB);
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
}
/* delete local refs */
(*jenv)->DeleteLocalRef(jenv, macOutBB);
(*jenv)->DeleteLocalRef(jenv, j_macIn);
(*jenv)->DeleteLocalRef(jenv, encOutBB);
(*jenv)->DeleteLocalRef(jenv, encInBB);
}
/* detach JNIEnv from thread */
(*jenv)->DeleteLocalRef(jenv, ctxRef);
/* delete local refs, detach JNIEnv from thread */
freeMacEncryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, macOutBB, j_macIn, encOutBB, encInBB);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return retval;
}
/* Delete JNI local references created inside NativeDecryptVerifyCb() */
static void freeDecryptVerifyCbLocalRefs(JNIEnv* jenv, jclass excClass,
jclass sessClass, jobject ctxRef, jclass innerCtxClass, jobject decOutBB,
jbyteArray j_decIn, jlongArray j_padSz)
{
if (jenv == NULL) {
return;
}
if (decOutBB != NULL) {
(*jenv)->DeleteLocalRef(jenv, decOutBB);
}
if (j_decIn != NULL) {
(*jenv)->DeleteLocalRef(jenv, j_decIn);
}
if (j_padSz != NULL) {
(*jenv)->DeleteLocalRef(jenv, j_padSz);
}
if (innerCtxClass != NULL) {
(*jenv)->DeleteLocalRef(jenv, innerCtxClass);
}
if (ctxRef != NULL) {
(*jenv)->DeleteLocalRef(jenv, ctxRef);
}
if (sessClass != NULL) {
(*jenv)->DeleteLocalRef(jenv, sessClass);
}
if (excClass != NULL) {
(*jenv)->DeleteLocalRef(jenv, excClass);
}
}
int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
const unsigned char* decIn, unsigned int decSz, int content,
int verify, unsigned int* padSz, void* ctx)
@ -2731,20 +2814,20 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
jint vmret = 0;
JNIEnv* jenv; /* JNI environment */
jclass excClass; /* WolfSSLJNIException class */
jclass excClass = NULL; /* WolfSSLJNIException class */
int needsDetach = 0; /* Should we explicitly detach? */
jobject* g_cachedSSLObj; /* WolfSSLSession cached object */
jclass sessClass; /* WolfSSLSession class */
jclass sessClass = NULL; /* WolfSSLSession class */
jfieldID ctxFid; /* WolfSSLSession->ctx FieldID */
jmethodID getCtxMethodId; /* WolfSSLSession->getAssCtxPtr() ID */
jobject ctxRef; /* WolfSSLContext object */
jclass innerCtxClass; /* WolfSSLContext class */
jobject ctxRef = NULL; /* WolfSSLContext object */
jclass innerCtxClass = NULL; /* WolfSSLContext class */
jmethodID decryptVerifyMethodId;
jbyteArray j_decIn;
jlongArray j_padSz;
jbyteArray j_decIn = NULL;
jlongArray j_padSz = NULL;
jobject decOutBB = NULL;
jlong tmpVal = 0;
@ -2776,6 +2859,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2786,7 +2871,9 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if (!g_cachedSSLObj) {
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLSession object reference in "
"NativeMacEncryptCb");
"NativeDecryptVerifyCb");
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2797,7 +2884,9 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if (!sessClass) {
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLSession class reference in "
"NativeMacEncryptCb");
"NativeDecryptVerifyCb");
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2814,6 +2903,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLContext field ID "
"in NativeDecryptVerifyCb");
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2831,6 +2922,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get getAssociatedContextPtr() method ID "
"in NativeDecryptVerifyCb");
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2843,6 +2936,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if (!ctxRef) {
(*jenv)->ThrowNew(jenv, excClass,
"Can't get WolfSSLContext object in NativeDecryptVerifyCb");
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2854,7 +2949,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLContext class reference "
"in NativeDecryptVerifyCb");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2873,7 +2969,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Error getting internalDecryptVerifyCallback method "
"from JNI");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2886,7 +2983,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if (!decOutBB) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create decOut ByteBuffer");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2897,8 +2995,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if (!j_decIn) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create decIn ByteArray");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2908,9 +3006,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2922,9 +3019,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if (!j_padSz) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create padSz longArray");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2939,10 +3035,8 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
(*jenv)->DeleteLocalRef(jenv, j_padSz);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -2954,31 +3048,63 @@ int NativeDecryptVerifyCb(WOLFSSL* ssl, unsigned char* decOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
(*jenv)->DeleteLocalRef(jenv, j_padSz);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass,
ctxRef, innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
}
*padSz = (unsigned int)tmpVal;
}
/* delete local refs */
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
(*jenv)->DeleteLocalRef(jenv, j_padSz);
}
/* delete local refs, detach JNIEnv from thread */
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeDecryptVerifyCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return retval;
}
/* Delete JNI local references created inside NativeVerifyDecryptCb() */
static void freeVerifyDecryptCbLocalRefs(JNIEnv* jenv, jclass excClass,
jclass sessClass, jobject ctxRef, jclass innerCtxClass, jobject decOutBB,
jbyteArray j_decIn, jlongArray j_padSz)
{
if (jenv == NULL) {
return;
}
if (decOutBB != NULL) {
(*jenv)->DeleteLocalRef(jenv, decOutBB);
}
if (j_decIn != NULL) {
(*jenv)->DeleteLocalRef(jenv, j_decIn);
}
if (j_padSz != NULL) {
(*jenv)->DeleteLocalRef(jenv, j_padSz);
}
if (innerCtxClass != NULL) {
(*jenv)->DeleteLocalRef(jenv, innerCtxClass);
}
if (ctxRef != NULL) {
(*jenv)->DeleteLocalRef(jenv, ctxRef);
}
if (sessClass != NULL) {
(*jenv)->DeleteLocalRef(jenv, sessClass);
}
if (excClass != NULL) {
(*jenv)->DeleteLocalRef(jenv, excClass);
}
}
int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
const unsigned char* decIn, unsigned int decSz, int content,
int macVerify, unsigned int* padSz, void* ctx)
@ -2987,21 +3113,21 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
jint vmret = 0;
JNIEnv* jenv; /* JNI environment */
jclass excClass; /* WolfSSLJNIException class */
jclass excClass = NULL; /* WolfSSLJNIException class */
int needsDetach = 0; /* Should we explicitly detach? */
int hmacSize = 0; /* WOLFSSL HMAC digest size */
jobject* g_cachedSSLObj; /* WolfSSLSession cached object */
jclass sessClass; /* WolfSSLSession class */
jclass sessClass = NULL; /* WolfSSLSession class */
jfieldID ctxFid; /* WolfSSLSession->ctx FieldID */
jmethodID getCtxMethodId; /* WolfSSLSession->getAssCtxPtr() ID */
jobject ctxRef; /* WolfSSLContext object */
jclass innerCtxClass; /* WolfSSLContext class */
jobject ctxRef = NULL; /* WolfSSLContext object */
jclass innerCtxClass = NULL; /* WolfSSLContext class */
jmethodID verifyDecryptMethodId;
jbyteArray j_decIn;
jlongArray j_padSz;
jbyteArray j_decIn = NULL;
jlongArray j_padSz = NULL;
jobject decOutBB = NULL;
jlong tmpVal = 0;
@ -3033,6 +3159,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3044,6 +3172,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLSession object reference in "
"NativeVerifyDecryptCb");
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3055,6 +3185,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLSession class reference in "
"NativeVerifyDecryptCb");
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3071,6 +3203,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLContext field ID "
"in NativeVerifyDecryptCb");
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3088,6 +3222,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get getAssociatedContextPtr() method ID "
"in NativeVerifyDecryptCb");
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3100,6 +3236,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
if (!ctxRef) {
(*jenv)->ThrowNew(jenv, excClass,
"Can't get WolfSSLContext object in NativeVerifyDecryptCb");
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3111,7 +3249,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Can't get native WolfSSLContext class reference "
"in NativeVerifyDecryptCb");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3130,7 +3269,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
(*jenv)->ThrowNew(jenv, excClass,
"Error getting internalVerifyDecryptCallback method "
"from JNI");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3146,7 +3286,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
if (!decOutBB) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create decOut ByteBuffer");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3157,8 +3298,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
if (!j_decIn) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create decIn ByteArray");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3168,9 +3309,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3182,9 +3322,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
if (!j_padSz) {
(*jenv)->ThrowNew(jenv, excClass,
"failed to create padSz longArray");
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3199,10 +3338,8 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
(*jenv)->DeleteLocalRef(jenv, j_padSz);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
@ -3214,25 +3351,19 @@ int NativeVerifyDecryptCb(WOLFSSL* ssl, unsigned char* decOut,
if ((*jenv)->ExceptionOccurred(jenv)) {
(*jenv)->ExceptionDescribe(jenv);
(*jenv)->ExceptionClear(jenv);
(*jenv)->DeleteLocalRef(jenv, ctxRef);
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
(*jenv)->DeleteLocalRef(jenv, j_padSz);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass,
ctxRef, innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);
return -1;
}
*padSz = (unsigned int)tmpVal;
}
/* delete local refs */
(*jenv)->DeleteLocalRef(jenv, decOutBB);
(*jenv)->DeleteLocalRef(jenv, j_decIn);
(*jenv)->DeleteLocalRef(jenv, j_padSz);
}
/* delete local refs, detach JNIEnv from thread */
(*jenv)->DeleteLocalRef(jenv, ctxRef);
freeVerifyDecryptCbLocalRefs(jenv, excClass, sessClass, ctxRef,
innerCtxClass, decOutBB, j_decIn, j_padSz);
if (needsDetach)
(*g_vm)->DetachCurrentThread(g_vm);