Skip to content

Commit 633b2cc

Browse files
authored
Merge pull request wolfSSL#347 from JeremiahM37/fenrir-fixes-2
Fenrir fixes
2 parents 372f6c2 + 9526632 commit 633b2cc

10 files changed

Lines changed: 182 additions & 29 deletions

native/com_wolfssl_WolfSSL.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2027,7 +2027,12 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSL_x509_1getDer
20272027

20282028
derCert = wolfSSL_X509_get_der(x509, &outSz);
20292029

2030-
if (outSz >= 0) {
2030+
if (outSz >= 0 && derCert != NULL) {
2031+
2032+
out = (*jenv)->NewByteArray(jenv, outSz);
2033+
if (out == NULL) {
2034+
return NULL;
2035+
}
20312036

20322037
(*jenv)->SetByteArrayRegion(jenv, out, 0, outSz, (jbyte*)derCert);
20332038
if ((*jenv)->ExceptionOccurred(jenv)) {

native/com_wolfssl_WolfSSLCRL.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1set_1lastUpdate
174174
}
175175
}
176176

177-
(*jenv)->ReleaseByteArrayElements(jenv, time, (jbyte*)timeBuf, JNI_ABORT);
177+
if (timeBuf != NULL) {
178+
(*jenv)->ReleaseByteArrayElements(jenv, time,
179+
(jbyte*)timeBuf, JNI_ABORT);
180+
}
178181

179182
return (jint)ret;
180183
#else
@@ -230,7 +233,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1set_1nextUpdate
230233
}
231234
}
232235

233-
(*jenv)->ReleaseByteArrayElements(jenv, time, (jbyte*)timeBuf, JNI_ABORT);
236+
if (timeBuf != NULL) {
237+
(*jenv)->ReleaseByteArrayElements(jenv, time,
238+
(jbyte*)timeBuf, JNI_ABORT);
239+
}
234240

235241
return (jint)ret;
236242
#else
@@ -285,8 +291,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1add_1revoked
285291
}
286292
}
287293

288-
(*jenv)->ReleaseByteArrayElements(jenv, serial, (jbyte*)serialBuf,
289-
JNI_ABORT);
294+
if (serialBuf != NULL) {
295+
(*jenv)->ReleaseByteArrayElements(jenv, serial,
296+
(jbyte*)serialBuf, JNI_ABORT);
297+
}
290298
if (serialInt != NULL) {
291299
wolfSSL_ASN1_INTEGER_free(serialInt);
292300
}
@@ -329,8 +337,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1add_1revoked_1cert
329337
ret = wolfSSL_X509_CRL_add_revoked_cert(crl, certBuf, certSz);
330338
}
331339

332-
(*jenv)->ReleaseByteArrayElements(jenv, certDer, (jbyte*)certBuf,
333-
JNI_ABORT);
340+
if (certBuf != NULL) {
341+
(*jenv)->ReleaseByteArrayElements(jenv, certDer,
342+
(jbyte*)certBuf, JNI_ABORT);
343+
}
334344

335345
return ret;
336346
#else

native/com_wolfssl_WolfSSLCertManager.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertManager_CertManagerLoadCABuff
119119
buff = (byte*)(*jenv)->GetByteArrayElements(jenv, in, NULL);
120120
buffSz = (*jenv)->GetArrayLength(jenv, in);
121121

122-
ret = wolfSSL_CertManagerLoadCABuffer(cm, buff, buffSz, format);
123-
124-
(*jenv)->ReleaseByteArrayElements(jenv, in, (jbyte*)buff, JNI_ABORT);
122+
if (buff != NULL) {
123+
ret = wolfSSL_CertManagerLoadCABuffer(cm, buff, buffSz, format);
124+
(*jenv)->ReleaseByteArrayElements(jenv, in,
125+
(jbyte*)buff, JNI_ABORT);
126+
}
127+
else {
128+
ret = BAD_FUNC_ARG;
129+
}
125130

126131
return (jint)ret;
127132
}

native/com_wolfssl_WolfSSLCertRequest.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertRequest_X509_1REQ_1add1_1attr
136136
attr, attrSz);
137137
}
138138

139-
(*jenv)->ReleaseByteArrayElements(jenv, attrBytes, (jbyte*)attr, JNI_ABORT);
139+
if (attr != NULL) {
140+
(*jenv)->ReleaseByteArrayElements(jenv, attrBytes,
141+
(jbyte*)attr, JNI_ABORT);
142+
}
140143

141144
return (jint)ret;
142145
#else
@@ -338,8 +341,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertRequest_X509_1REQ_1sign
338341
XMEMSET(derBuf, 0, derSz);
339342
XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
340343
}
341-
(*jenv)->ReleaseByteArrayElements(jenv, keyBytes, (jbyte*)keyBuf,
342-
JNI_ABORT);
344+
if (keyBuf != NULL) {
345+
(*jenv)->ReleaseByteArrayElements(jenv, keyBytes,
346+
(jbyte*)keyBuf, JNI_ABORT);
347+
}
343348
if (mdName != NULL) {
344349
(*jenv)->ReleaseStringUTFChars(jenv, digestAlg, mdName);
345350
}
@@ -447,8 +452,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertRequest_X509_1REQ_1set_1pubke
447452
XMEMSET(derBuf, 0, derSz);
448453
XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
449454
}
450-
(*jenv)->ReleaseByteArrayElements(jenv, fileBytes, (jbyte*)fileBuf,
451-
JNI_ABORT);
455+
if (fileBuf != NULL) {
456+
(*jenv)->ReleaseByteArrayElements(jenv, fileBytes,
457+
(jbyte*)fileBuf, JNI_ABORT);
458+
}
452459

453460
return (jint)ret;
454461
#else

native/com_wolfssl_WolfSSLCertificate.c

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1issuer_1na
156156
wolfSSL_X509_free(x509In);
157157
}
158158

159-
(*jenv)->ReleaseByteArrayElements(jenv, certDer, (jbyte*)der, JNI_ABORT);
159+
if (der != NULL) {
160+
(*jenv)->ReleaseByteArrayElements(jenv, certDer,
161+
(jbyte*)der, JNI_ABORT);
162+
}
160163

161164
return ret;
162165
#else
@@ -260,8 +263,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1pubkey_1na
260263
XMEMSET(derBuf, 0, derSz);
261264
XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
262265
}
263-
(*jenv)->ReleaseByteArrayElements(jenv, fileBytes, (jbyte*)fileBuf,
264-
JNI_ABORT);
266+
if (fileBuf != NULL) {
267+
(*jenv)->ReleaseByteArrayElements(jenv, fileBytes,
268+
(jbyte*)fileBuf, JNI_ABORT);
269+
}
265270

266271
return (jint)ret;
267272
#else
@@ -562,6 +567,11 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1serialNumb
562567
if (serial == NULL) {
563568
ret = WOLFSSL_FAILURE;
564569
}
570+
else if (serialSz > (int)(serial->dataMax - 2)) {
571+
wolfSSL_ASN1_INTEGER_free(serial);
572+
serial = NULL;
573+
ret = WOLFSSL_FAILURE;
574+
}
565575
else {
566576
serial->data[0] = ASN_INTEGER;
567577
serial->data[1] = serialSz;
@@ -579,8 +589,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1serialNumb
579589
wolfSSL_ASN1_INTEGER_free(serial);
580590
}
581591

582-
(*jenv)->ReleaseByteArrayElements(jenv, serialBytes, (jbyte*)serialBuf,
583-
JNI_ABORT);
592+
if (serialBuf != NULL) {
593+
(*jenv)->ReleaseByteArrayElements(jenv, serialBytes,
594+
(jbyte*)serialBuf, JNI_ABORT);
595+
}
584596

585597
return ret;
586598
#else
@@ -621,7 +633,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1subject_1k
621633
ret = wolfSSL_X509_set_subject_key_id(x509, skidBuf, skidSz);
622634
}
623635

624-
(*jenv)->ReleaseByteArrayElements(jenv, skid, (jbyte*)skidBuf, JNI_ABORT);
636+
if (skidBuf != NULL) {
637+
(*jenv)->ReleaseByteArrayElements(jenv, skid,
638+
(jbyte*)skidBuf, JNI_ABORT);
639+
}
625640

626641
return (jint)ret;
627642
#else
@@ -693,7 +708,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1authority_
693708
ret = wolfSSL_X509_set_authority_key_id(x509, akidBuf, akidSz);
694709
}
695710

696-
(*jenv)->ReleaseByteArrayElements(jenv, akid, (jbyte*)akidBuf, JNI_ABORT);
711+
if (akidBuf != NULL) {
712+
(*jenv)->ReleaseByteArrayElements(jenv, akid,
713+
(jbyte*)akidBuf, JNI_ABORT);
714+
}
697715

698716
return (jint)ret;
699717
#else
@@ -767,7 +785,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1CRL_1set_1dist_
767785
ret = wolfSSL_X509_CRL_set_dist_points(x509, derBuf, derSz);
768786
}
769787

770-
(*jenv)->ReleaseByteArrayElements(jenv, der, (jbyte*)derBuf, JNI_ABORT);
788+
if (derBuf != NULL) {
789+
(*jenv)->ReleaseByteArrayElements(jenv, der,
790+
(jbyte*)derBuf, JNI_ABORT);
791+
}
771792

772793
return (jint)ret;
773794
#else
@@ -968,8 +989,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1sign
968989
XMEMSET(derBuf, 0, derSz);
969990
XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
970991
}
971-
(*jenv)->ReleaseByteArrayElements(jenv, fileBytes, (jbyte*)fileBuf,
972-
JNI_ABORT);
992+
if (fileBuf != NULL) {
993+
(*jenv)->ReleaseByteArrayElements(jenv, fileBytes,
994+
(jbyte*)fileBuf, JNI_ABORT);
995+
}
973996
if (mdName != NULL) {
974997
(*jenv)->ReleaseStringUTFChars(jenv, digestAlg, mdName);
975998
}
@@ -1008,7 +1031,10 @@ JNIEXPORT jlong JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1load_1certific
10081031
}
10091032

10101033
/* release array, don't copy back contents */
1011-
(*jenv)->ReleaseByteArrayElements(jenv, in, (jbyte*)certBuf, JNI_ABORT);
1034+
if (certBuf != NULL) {
1035+
(*jenv)->ReleaseByteArrayElements(jenv, in,
1036+
(jbyte*)certBuf, JNI_ABORT);
1037+
}
10121038

10131039
return (jlong)(uintptr_t)x509;
10141040
}

native/com_wolfssl_WolfSSLContext.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,7 @@ int NativeVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
558558
JNIEnv* jenv;
559559
jint vmret = 0;
560560
jint retval = -1;
561+
int needsDetach = 0;
561562
jclass excClass = NULL;
562563
jclass verifyClass = NULL;
563564
jmethodID verifyMethod = NULL;
@@ -579,6 +580,7 @@ int NativeVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
579580
if (vmret) {
580581
return -101; /* failed to attach JNIEnv to thread */
581582
}
583+
needsDetach = 1;
582584
} else if (vmret != JNI_OK) {
583585
return -102; /* unable to get JNIEnv from JavaVM */
584586
}
@@ -588,6 +590,8 @@ int NativeVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
588590
if( (*jenv)->ExceptionOccurred(jenv)) {
589591
(*jenv)->ExceptionDescribe(jenv);
590592
(*jenv)->ExceptionClear(jenv);
593+
if (needsDetach)
594+
(*g_vm)->DetachCurrentThread(g_vm);
591595
return -103;
592596
}
593597

@@ -605,6 +609,8 @@ int NativeVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
605609

606610
(*jenv)->ThrowNew(jenv, excClass,
607611
"Can't get native WolfSSLVerifyCallback class reference");
612+
if (needsDetach)
613+
(*g_vm)->DetachCurrentThread(g_vm);
608614
return -104;
609615
}
610616

@@ -618,6 +624,8 @@ int NativeVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
618624

619625
(*jenv)->ThrowNew(jenv, excClass,
620626
"Error getting verifyCallback method from JNI");
627+
if (needsDetach)
628+
(*g_vm)->DetachCurrentThread(g_vm);
621629
return -105;
622630
}
623631

@@ -628,6 +636,8 @@ int NativeVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
628636
/* exception occurred on the Java side during method call */
629637
(*jenv)->ExceptionDescribe(jenv);
630638
(*jenv)->ExceptionClear(jenv);
639+
if (needsDetach)
640+
(*g_vm)->DetachCurrentThread(g_vm);
631641
return -106;
632642
}
633643

@@ -639,9 +649,14 @@ int NativeVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
639649

640650
(*jenv)->ThrowNew(jenv, excClass,
641651
"Object reference invalid in NativeVerifyCallback");
652+
if (needsDetach)
653+
(*g_vm)->DetachCurrentThread(g_vm);
642654
return -1;
643655
}
644656

657+
if (needsDetach)
658+
(*g_vm)->DetachCurrentThread(g_vm);
659+
645660
return retval;
646661
}
647662

native/com_wolfssl_WolfSSLSession.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ int NativeSSLVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
105105
JNIEnv* jenv;
106106
jint vmret = 0;
107107
jint retval = -1;
108+
int needsDetach = 0;
108109
jobjectRefType refcheck;
109110
SSLAppData* appData; /* WOLFSSL app data, stored verify cb obj */
110111
jobject* g_verifySSLCbIfaceObj; /* Global jobject, stored in app data */
@@ -125,6 +126,7 @@ int NativeSSLVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
125126
if (vmret) {
126127
return -101; /* failed to attach JNIEnv to thread */
127128
}
129+
needsDetach = 1;
128130
} else if (vmret != JNI_OK) {
129131
return -102; /* unable to get JNIEnv from JavaVM */
130132
}
@@ -134,13 +136,17 @@ int NativeSSLVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
134136
wolfSSL_X509_STORE_CTX_get_ex_data(store, 0));
135137
if (appData == NULL) {
136138
printf("Error getting app data from WOLFSSL\n");
139+
if (needsDetach)
140+
(*g_vm)->DetachCurrentThread(g_vm);
137141
return -105;
138142
}
139143

140144
/* get global Java verify callback object */
141145
g_verifySSLCbIfaceObj = appData->g_verifySSLCbIfaceObj;
142146
if (g_verifySSLCbIfaceObj == NULL || *g_verifySSLCbIfaceObj == NULL) {
143147
printf("Error getting g_verifySSLCbIfaceObj from appData\n");
148+
if (needsDetach)
149+
(*g_vm)->DetachCurrentThread(g_vm);
144150
return -106;
145151
}
146152

@@ -156,6 +162,8 @@ int NativeSSLVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
156162

157163
throwWolfSSLJNIException(jenv,
158164
"verifyCallback method ID is null in NativeSSLVerifyCallback");
165+
if (needsDetach)
166+
(*g_vm)->DetachCurrentThread(g_vm);
159167
return -107;
160168
}
161169

@@ -167,6 +175,8 @@ int NativeSSLVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
167175
/* exception occurred on the Java side during method call */
168176
(*jenv)->ExceptionDescribe(jenv);
169177
(*jenv)->ExceptionClear(jenv);
178+
if (needsDetach)
179+
(*g_vm)->DetachCurrentThread(g_vm);
170180
return -109;
171181
}
172182

@@ -178,9 +188,14 @@ int NativeSSLVerifyCallback(int preverify_ok, WOLFSSL_X509_STORE_CTX* store)
178188

179189
throwWolfSSLJNIException(jenv,
180190
"Object reference invalid in NativeSSLVerifyCallback");
191+
if (needsDetach)
192+
(*g_vm)->DetachCurrentThread(g_vm);
181193
return -1;
182194
}
183195

196+
if (needsDetach)
197+
(*g_vm)->DetachCurrentThread(g_vm);
198+
184199
return retval;
185200
}
186201

native/com_wolfssl_WolfSSLX509Name.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,13 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLX509Name_X509_1NAME_1add_1entry_1
106106
entry, len, (int)loc, (int)set);
107107
}
108108

109-
(*jenv)->ReleaseByteArrayElements(jenv, entryArr, (jbyte*)entry, JNI_ABORT);
110-
(*jenv)->ReleaseStringUTFChars(jenv, fieldStr, field);
109+
if (entry != NULL) {
110+
(*jenv)->ReleaseByteArrayElements(jenv, entryArr,
111+
(jbyte*)entry, JNI_ABORT);
112+
}
113+
if (field != NULL) {
114+
(*jenv)->ReleaseStringUTFChars(jenv, fieldStr, field);
115+
}
111116

112117
return (jint)ret;
113118
#else

src/java/com/wolfssl/provider/jsse/WolfSSLAuthStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ protected void resizeCache(int sz, int side) {
284284

285285
/* @TODO check for side server/client, currently a resize is for all */
286286
synchronized (storeLock) {
287-
store.putAll(newStore);
287+
newStore.putAll(store);
288288
store = newStore;
289289
}
290290
}

0 commit comments

Comments
 (0)