Skip to content

Commit b226e7d

Browse files
committed
free native WOLFSSL PK callback ctx global jni refs in wolfSSL_free()
1 parent 8c01c9c commit b226e7d

1 file changed

Lines changed: 112 additions & 25 deletions

File tree

native/com_wolfssl_WolfSSLSession.c

Lines changed: 112 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,9 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_freeSSL
904904
jclass excClass;
905905
SSLAppData* appData;
906906
(void)jcl;
907+
#if defined(HAVE_PK_CALLBACKS) && (defined(HAVE_ECC) || !defined(NO_RSA))
908+
internCtx* pkCtx = NULL;
909+
#endif
907910

908911
excClass = (*jenv)->FindClass(jenv, "com/wolfssl/WolfSSLException");
909912

@@ -965,6 +968,76 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_freeSSL
965968
}
966969
#endif
967970

971+
#if defined(HAVE_PK_CALLBACKS)
972+
#ifdef HAVE_ECC
973+
/* free ECC sign callback CTX global reference if set */
974+
pkCtx = (internCtx*) wolfSSL_GetEccSignCtx((WOLFSSL*)(uintptr_t)ssl);
975+
if (pkCtx != NULL) {
976+
if (pkCtx->obj != NULL) {
977+
(*jenv)->DeleteGlobalRef(jenv, pkCtx->obj);
978+
}
979+
XFREE(pkCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
980+
}
981+
982+
/* free ECC verify callback CTX global reference if set */
983+
pkCtx = (internCtx*)wolfSSL_GetEccVerifyCtx((WOLFSSL*)(uintptr_t)ssl);
984+
if (pkCtx != NULL) {
985+
if (pkCtx->obj != NULL) {
986+
(*jenv)->DeleteGlobalRef(jenv, pkCtx->obj);
987+
}
988+
XFREE(pkCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
989+
}
990+
991+
/* free ECC shared secret callback CTX global reference if set */
992+
pkCtx = (internCtx*)wolfSSL_GetEccSharedSecretCtx(
993+
(WOLFSSL*)(uintptr_t)ssl);
994+
if (pkCtx != NULL) {
995+
if (pkCtx->obj != NULL) {
996+
(*jenv)->DeleteGlobalRef(jenv, pkCtx->obj);
997+
}
998+
XFREE(pkCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
999+
}
1000+
#endif /* HAVE_ECC */
1001+
1002+
#ifndef NO_RSA
1003+
/* free RSA sign callback CTX global reference if set */
1004+
pkCtx = (internCtx*) wolfSSL_GetRsaSignCtx((WOLFSSL*)(uintptr_t)ssl);
1005+
if (pkCtx != NULL) {
1006+
if (pkCtx->obj != NULL) {
1007+
(*jenv)->DeleteGlobalRef(jenv, pkCtx->obj);
1008+
}
1009+
XFREE(pkCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1010+
}
1011+
1012+
/* free RSA verify callback CTX global reference if set */
1013+
pkCtx = (internCtx*)wolfSSL_GetRsaVerifyCtx((WOLFSSL*)(uintptr_t)ssl);
1014+
if (pkCtx != NULL) {
1015+
if (pkCtx->obj != NULL) {
1016+
(*jenv)->DeleteGlobalRef(jenv, pkCtx->obj);
1017+
}
1018+
XFREE(pkCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1019+
}
1020+
1021+
/* free RSA encrypt callback CTX global reference if set */
1022+
pkCtx = (internCtx*) wolfSSL_GetRsaEncCtx((WOLFSSL*)(uintptr_t)ssl);
1023+
if (pkCtx != NULL) {
1024+
if (pkCtx->obj != NULL) {
1025+
(*jenv)->DeleteGlobalRef(jenv, pkCtx->obj);
1026+
}
1027+
XFREE(pkCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1028+
}
1029+
1030+
/* free RSA decrypt callback CTX global reference if set */
1031+
pkCtx = (internCtx*) wolfSSL_GetRsaDecCtx((WOLFSSL*)(uintptr_t)ssl);
1032+
if (pkCtx != NULL) {
1033+
if (pkCtx->obj != NULL) {
1034+
(*jenv)->DeleteGlobalRef(jenv, pkCtx->obj);
1035+
}
1036+
XFREE(pkCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1037+
}
1038+
#endif /* !NO_RSA */
1039+
#endif /* HAVE_PK_CALLBACKS */
1040+
9681041
/* native cleanup */
9691042
wolfSSL_free((WOLFSSL*)(uintptr_t)ssl);
9701043
ssl = 0;
@@ -2729,8 +2802,10 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setEccSignCtx
27292802
/* note: if CTX has not been set up yet, wolfSSL defaults to NULL */
27302803
if (eccSignCtx != NULL) {
27312804
myCtx = (internCtx*)eccSignCtx;
2732-
if (myCtx->active == 1) {
2733-
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
2805+
if (myCtx != NULL) {
2806+
if (myCtx->active == 1) {
2807+
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
2808+
}
27342809
XFREE(myCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
27352810
}
27362811
}
@@ -2805,8 +2880,10 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setEccVerifyCtx
28052880
/* note: if CTX has not been set up yet, wolfSSL defaults to NULL */
28062881
if (eccVerifyCtx != NULL) {
28072882
myCtx = (internCtx*)eccVerifyCtx;
2808-
if (myCtx->active == 1) {
2809-
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
2883+
if (myCtx != NULL) {
2884+
if (myCtx->active == 1) {
2885+
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
2886+
}
28102887
XFREE(myCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28112888
}
28122889
}
@@ -2824,7 +2901,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setEccVerifyCtx
28242901

28252902
/* store global ref to WolfSSLSession object */
28262903
myCtx->obj = (*jenv)->NewGlobalRef(jenv, jcl);
2827-
if (!myCtx->obj) {
2904+
if (myCtx->obj == NULL) {
28282905
(*jenv)->ThrowNew(jenv, excClass,
28292906
"Unable to store WolfSSLSession object as global reference");
28302907
return;
@@ -2881,15 +2958,17 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setEccSharedSecretCtx
28812958
/* note: if CTX has not been set up yet, wolfSSL defaults to NULL */
28822959
if (eccSharedSecretCtx != NULL) {
28832960
myCtx = (internCtx*)eccSharedSecretCtx;
2884-
if (myCtx->active == 1) {
2885-
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
2961+
if (myCtx != NULL) {
2962+
if (myCtx->active == 1) {
2963+
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
2964+
}
28862965
XFREE(myCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28872966
}
28882967
}
28892968

28902969
/* allocate memory for internal JNI object reference */
28912970
myCtx = XMALLOC(sizeof(internCtx), NULL, DYNAMIC_TYPE_TMP_BUFFER);
2892-
if (!myCtx) {
2971+
if (myCtx == NULL) {
28932972
(*jenv)->ThrowNew(jenv, excClass,
28942973
"Unable to allocate memory for ECC shared secret context\n");
28952974
return;
@@ -2900,7 +2979,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setEccSharedSecretCtx
29002979

29012980
/* store global ref to WolfSSLSession object */
29022981
myCtx->obj = (*jenv)->NewGlobalRef(jenv, jcl);
2903-
if (!myCtx->obj) {
2982+
if (myCtx->obj == NULL) {
29042983
(*jenv)->ThrowNew(jenv, excClass,
29052984
"Unable to store WolfSSLSession object as global reference");
29062985
return;
@@ -2956,15 +3035,17 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setRsaSignCtx
29563035
/* note: if CTX has not been set up yet, wolfSSL defaults to NULL */
29573036
if (rsaSignCtx != NULL) {
29583037
myCtx = (internCtx*)rsaSignCtx;
2959-
if (myCtx->active == 1) {
2960-
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
3038+
if (myCtx != NULL) {
3039+
if (myCtx->active == 1) {
3040+
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
3041+
}
29613042
XFREE(myCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
29623043
}
29633044
}
29643045

29653046
/* allocate memory for internal JNI object reference */
29663047
myCtx = XMALLOC(sizeof(internCtx), NULL, DYNAMIC_TYPE_TMP_BUFFER);
2967-
if (!myCtx) {
3048+
if (myCtx == NULL) {
29683049
(*jenv)->ThrowNew(jenv, excClass,
29693050
"Unable to allocate memory for RSA sign context\n");
29703051
return;
@@ -2975,7 +3056,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setRsaSignCtx
29753056

29763057
/* store global ref to WolfSSLSession object */
29773058
myCtx->obj = (*jenv)->NewGlobalRef(jenv, jcl);
2978-
if (!myCtx->obj) {
3059+
if (myCtx->obj == NULL) {
29793060
(*jenv)->ThrowNew(jenv, excClass,
29803061
"Unable to store WolfSSLSession object as global reference");
29813062
return;
@@ -3032,15 +3113,17 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setRsaVerifyCtx
30323113
/* note: if CTX has not been set up yet, wolfSSL defaults to NULL */
30333114
if (rsaVerifyCtx != NULL) {
30343115
myCtx = (internCtx*)rsaVerifyCtx;
3035-
if (myCtx->active == 1) {
3036-
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
3116+
if (myCtx != NULL) {
3117+
if (myCtx->active == 1) {
3118+
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
3119+
}
30373120
XFREE(myCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
30383121
}
30393122
}
30403123

30413124
/* allocate memory for internal JNI object reference */
30423125
myCtx = XMALLOC(sizeof(internCtx), NULL, DYNAMIC_TYPE_TMP_BUFFER);
3043-
if (!myCtx) {
3126+
if (myCtx == NULL) {
30443127
(*jenv)->ThrowNew(jenv, excClass,
30453128
"Unable to allocate memory for RSA verify context\n");
30463129
return;
@@ -3051,7 +3134,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setRsaVerifyCtx
30513134

30523135
/* store global ref to WolfSSLSession object */
30533136
myCtx->obj = (*jenv)->NewGlobalRef(jenv, jcl);
3054-
if (!myCtx->obj) {
3137+
if (myCtx->obj == NULL) {
30553138
(*jenv)->ThrowNew(jenv, excClass,
30563139
"Unable to store WolfSSLSession object as global reference");
30573140
return;
@@ -3107,15 +3190,17 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setRsaEncCtx
31073190
/* note: if CTX has not been set up yet, wolfSSL defaults to NULL */
31083191
if (rsaEncCtx != NULL) {
31093192
myCtx = (internCtx*)rsaEncCtx;
3110-
if (myCtx->active == 1) {
3111-
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
3193+
if (myCtx != NULL) {
3194+
if (myCtx->active == 1) {
3195+
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
3196+
}
31123197
XFREE(myCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
31133198
}
31143199
}
31153200

31163201
/* allocate memory for internal JNI object reference */
31173202
myCtx = XMALLOC(sizeof(internCtx), NULL, DYNAMIC_TYPE_TMP_BUFFER);
3118-
if (!myCtx) {
3203+
if (myCtx == NULL) {
31193204
(*jenv)->ThrowNew(jenv, excClass,
31203205
"Unable to allocate memory for RSA encrypt context\n");
31213206
return;
@@ -3126,7 +3211,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setRsaEncCtx
31263211

31273212
/* store global ref to WolfSSLSession object */
31283213
myCtx->obj = (*jenv)->NewGlobalRef(jenv, jcl);
3129-
if (!myCtx->obj) {
3214+
if (myCtx->obj == NULL) {
31303215
(*jenv)->ThrowNew(jenv, excClass,
31313216
"Unable to store WolfSSLSession object as global reference");
31323217
return;
@@ -3182,15 +3267,17 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setRsaDecCtx
31823267
/* note: if CTX has not been set up yet, wolfSSL defaults to NULL */
31833268
if (rsaDecCtx != NULL) {
31843269
myCtx = (internCtx*)rsaDecCtx;
3185-
if (myCtx->active == 1) {
3186-
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
3270+
if (myCtx != NULL) {
3271+
if (myCtx->active == 1) {
3272+
(*jenv)->DeleteGlobalRef(jenv, myCtx->obj);
3273+
}
31873274
XFREE(myCtx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
31883275
}
31893276
}
31903277

31913278
/* allocate memory for internal JNI object reference */
31923279
myCtx = XMALLOC(sizeof(internCtx), NULL, DYNAMIC_TYPE_TMP_BUFFER);
3193-
if (!myCtx) {
3280+
if (myCtx == NULL) {
31943281
(*jenv)->ThrowNew(jenv, excClass,
31953282
"Unable to allocate memory for RSA decrypt context\n");
31963283
return;
@@ -3201,7 +3288,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLSession_setRsaDecCtx
32013288

32023289
/* store global ref to WolfSSLSession object */
32033290
myCtx->obj = (*jenv)->NewGlobalRef(jenv, jcl);
3204-
if (!myCtx->obj) {
3291+
if (myCtx->obj == NULL) {
32053292
(*jenv)->ThrowNew(jenv, excClass,
32063293
"Unable to store WolfSSLSession object as global reference");
32073294
return;

0 commit comments

Comments
 (0)