@@ -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