Skip to content

Commit 7597b5e

Browse files
committed
make sure to DeleteGlobalRef on g_cachedSSLObj in error cases when setting up in newSSL()
1 parent c7925f4 commit 7597b5e

1 file changed

Lines changed: 30 additions & 16 deletions

File tree

native/com_wolfssl_WolfSSLSession.c

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -169,36 +169,31 @@ JNIEXPORT jlong JNICALL Java_com_wolfssl_WolfSSLSession_newSSL
169169
(JNIEnv* jenv, jobject jcl, jlong ctx)
170170
{
171171
int ret;
172-
jlong sslPtr;
173-
jobject* g_cachedObj;
174-
wolfSSL_Mutex* jniSessLock;
175-
SSLAppData* appData;
172+
jlong sslPtr = 0;
173+
jobject* g_cachedSSLObj = NULL;
174+
wolfSSL_Mutex* jniSessLock = NULL;
175+
SSLAppData* appData = NULL;
176176

177-
if (!jenv)
177+
if (jenv == NULL) {
178178
return SSL_FAILURE;
179+
}
179180

180181
/* wolfSSL java caller checks for null pointer */
181182
sslPtr = (jlong)(uintptr_t)wolfSSL_new((WOLFSSL_CTX*)(uintptr_t)ctx);
182183

183184
if (sslPtr != 0) {
184185
/* create global reference to WolfSSLSession jobject */
185-
g_cachedObj = (jobject*)XMALLOC(sizeof(jobject), NULL,
186+
g_cachedSSLObj = (jobject*)XMALLOC(sizeof(jobject), NULL,
186187
DYNAMIC_TYPE_TMP_BUFFER);
187-
if (!g_cachedObj) {
188+
if (g_cachedSSLObj == NULL) {
188189
printf("error mallocing memory in newSSL\n");
189190
wolfSSL_free((WOLFSSL*)(uintptr_t)sslPtr);
190191
return SSL_FAILURE;
191192
}
192-
*g_cachedObj = (*jenv)->NewGlobalRef(jenv, jcl);
193-
if (!*g_cachedObj) {
193+
*g_cachedSSLObj = (*jenv)->NewGlobalRef(jenv, jcl);
194+
if (*g_cachedSSLObj == NULL) {
194195
printf("error storing global WolfSSLSession object\n");
195-
wolfSSL_free((WOLFSSL*)(uintptr_t)sslPtr);
196-
return SSL_FAILURE;
197-
}
198-
/* cache associated WolfSSLSession jobject in native WOLFSSL */
199-
ret = wolfSSL_set_jobject((WOLFSSL*)(uintptr_t)sslPtr, g_cachedObj);
200-
if (ret != SSL_SUCCESS) {
201-
printf("error storing jobject in wolfSSL native session\n");
196+
XFREE(g_cachedSSLObj, NULL, DYNAMIC_TYPE_TMP_BUFFER);
202197
wolfSSL_free((WOLFSSL*)(uintptr_t)sslPtr);
203198
return SSL_FAILURE;
204199
}
@@ -207,6 +202,8 @@ JNIEXPORT jlong JNICALL Java_com_wolfssl_WolfSSLSession_newSSL
207202
DYNAMIC_TYPE_TMP_BUFFER);
208203
if (appData == NULL) {
209204
printf("error allocating memory in newSSL for SSLAppData\n");
205+
(*jenv)->DeleteGlobalRef(jenv, *g_cachedSSLObj);
206+
XFREE(g_cachedSSLObj, NULL, DYNAMIC_TYPE_TMP_BUFFER);
210207
wolfSSL_free((WOLFSSL*)(uintptr_t)sslPtr);
211208
return SSL_FAILURE;
212209
}
@@ -218,19 +215,36 @@ JNIEXPORT jlong JNICALL Java_com_wolfssl_WolfSSLSession_newSSL
218215
DYNAMIC_TYPE_TMP_BUFFER);
219216
if (!jniSessLock) {
220217
printf("error mallocing memory in newSSL for jniSessLock\n");
218+
(*jenv)->DeleteGlobalRef(jenv, *g_cachedSSLObj);
221219
XFREE(appData, NULL, DYNAMIC_TYPE_TMP_BUFFER);
220+
XFREE(g_cachedSSLObj, NULL, DYNAMIC_TYPE_TMP_BUFFER);
222221
wolfSSL_free((WOLFSSL*)(uintptr_t)sslPtr);
223222
return SSL_FAILURE;
224223
}
225224

226225
wc_InitMutex(jniSessLock);
227226
appData->jniSessLock = jniSessLock;
228227

228+
/* cache associated WolfSSLSession jobject in native WOLFSSL */
229+
ret = wolfSSL_set_jobject((WOLFSSL*)(uintptr_t)sslPtr, g_cachedSSLObj);
230+
if (ret != SSL_SUCCESS) {
231+
printf("error storing jobject in wolfSSL native session\n");
232+
(*jenv)->DeleteGlobalRef(jenv, *g_cachedSSLObj);
233+
XFREE(appData, NULL, DYNAMIC_TYPE_TMP_BUFFER);
234+
XFREE(g_cachedSSLObj, NULL, DYNAMIC_TYPE_TMP_BUFFER);
235+
wolfSSL_free((WOLFSSL*)(uintptr_t)sslPtr);
236+
return SSL_FAILURE;
237+
}
238+
239+
/* cache SSLAppData into native WOLFSSL */
229240
if (wolfSSL_set_app_data(
230241
(WOLFSSL*)(uintptr_t)sslPtr, appData) != SSL_SUCCESS) {
231242
printf("error setting WOLFSSL app data in newSSL\n");
243+
(*jenv)->DeleteGlobalRef(jenv, *g_cachedSSLObj);
232244
XFREE(jniSessLock, NULL, DYNAMIC_TYPE_TMP_BUFFER);
233245
XFREE(appData, NULL, DYNAMIC_TYPE_TMP_BUFFER);
246+
XFREE(g_cachedSSLObj, NULL, DYNAMIC_TYPE_TMP_BUFFER);
247+
wolfSSL_set_jobject((WOLFSSL*)(uintptr_t)sslPtr, NULL);
234248
wolfSSL_free((WOLFSSL*)(uintptr_t)sslPtr);
235249
return SSL_FAILURE;
236250
}

0 commit comments

Comments
 (0)