Skip to content

Commit bac6771

Browse files
authored
Merge pull request #8499 from SparkiDev/crl_list_fix
CRL: fix memory allocation failure leaks
2 parents 4eda5e1 + 6f268c4 commit bac6771

5 files changed

Lines changed: 46 additions & 3 deletions

File tree

src/crl.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@ int InitCRL(WOLFSSL_CRL* crl, WOLFSSL_CERT_MANAGER* cm)
8787
WOLFSSL_MSG("Init Mutex failed");
8888
return BAD_MUTEX_E;
8989
}
90+
#ifdef OPENSSL_ALL
91+
{
92+
int ret;
93+
wolfSSL_RefInit(&crl->ref, &ret);
94+
(void)ret;
95+
}
96+
#endif
9097

9198
return 0;
9299
}
@@ -213,7 +220,7 @@ static void CRL_Entry_free(CRL_Entry* crle, void* heap)
213220

214221
WOLFSSL_ENTER("FreeCRL_Entry");
215222

216-
while (tmp) {
223+
while (tmp != NULL) {
217224
next = tmp->next;
218225
XFREE(tmp, heap, DYNAMIC_TYPE_REVOKED);
219226
tmp = next;
@@ -241,11 +248,24 @@ void FreeCRL(WOLFSSL_CRL* crl, int dynamic)
241248
{
242249
CRL_Entry* tmp;
243250

251+
WOLFSSL_ENTER("FreeCRL");
252+
244253
if (crl == NULL)
245254
return;
246255

256+
#ifdef OPENSSL_ALL
257+
{
258+
int ret;
259+
int doFree = 0;
260+
wolfSSL_RefDec(&crl->ref, &doFree, &ret);
261+
if (ret != 0)
262+
WOLFSSL_MSG("Couldn't lock x509 mutex");
263+
if (!doFree)
264+
return;
265+
}
266+
#endif
267+
247268
tmp = crl->crlList;
248-
WOLFSSL_ENTER("FreeCRL");
249269
#ifdef HAVE_CRL_MONITOR
250270
if (crl->monitors[0].path)
251271
XFREE(crl->monitors[0].path, crl->heap, DYNAMIC_TYPE_CRL_MONITOR);
@@ -916,9 +936,17 @@ static CRL_Entry* DupCRL_Entry(const CRL_Entry* ent, void* heap)
916936

917937
#ifndef CRL_STATIC_REVOKED_LIST
918938
dupl->certs = DupRevokedCertList(ent->certs, heap);
939+
if (ent->certs != NULL && dupl->certs == NULL) {
940+
CRL_Entry_free(dupl, heap);
941+
return NULL;
942+
}
919943
#endif
920944
#ifdef OPENSSL_EXTRA
921945
dupl->issuer = wolfSSL_X509_NAME_dup(ent->issuer);
946+
if (ent->issuer != NULL && dupl->issuer == NULL) {
947+
CRL_Entry_free(dupl, heap);
948+
return NULL;
949+
}
922950
#endif
923951

924952
if (!ent->verified) {
@@ -1035,6 +1063,8 @@ static int DupX509_CRL(WOLFSSL_X509_CRL *dupl, const WOLFSSL_X509_CRL* crl)
10351063
#endif
10361064

10371065
dupl->crlList = DupCRL_list(crl->crlList, dupl->heap);
1066+
if (dupl->crlList == NULL)
1067+
return MEMORY_E;
10381068
#ifdef HAVE_CRL_IO
10391069
dupl->crlIOCb = crl->crlIOCb;
10401070
#endif

src/x509.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14092,6 +14092,11 @@ void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *obj)
1409214092
if (obj->type == WOLFSSL_X509_LU_X509) {
1409314093
wolfSSL_X509_free(obj->data.x509);
1409414094
}
14095+
#ifdef HAVE_CRL
14096+
else if (obj->type == WOLFSSL_X509_LU_CRL) {
14097+
wolfSSL_X509_CRL_free(obj->data.crl);
14098+
}
14099+
#endif
1409514100
else {
1409614101
/* We don't free as this will point to
1409714102
* store->cm->crl which we don't own */

src/x509_str.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1912,6 +1912,7 @@ WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* wolfSSL_X509_STORE_get0_objects(
19121912

19131913
#ifdef HAVE_CRL
19141914
if (store->cm->crl != NULL) {
1915+
int res;
19151916
obj = wolfSSL_X509_OBJECT_new();
19161917
if (obj == NULL) {
19171918
WOLFSSL_MSG("wolfSSL_X509_OBJECT_new error");
@@ -1923,6 +1924,11 @@ WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* wolfSSL_X509_STORE_get0_objects(
19231924
goto err_cleanup;
19241925
}
19251926
obj->type = WOLFSSL_X509_LU_CRL;
1927+
wolfSSL_RefInc(&store->cm->crl->ref, &res);
1928+
if (res != 0) {
1929+
WOLFSSL_MSG("Failed to lock crl mutex");
1930+
goto err_cleanup;
1931+
}
19261932
obj->data.crl = store->cm->crl;
19271933
}
19281934
#endif

tests/api.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55756,7 +55756,6 @@ static int test_X509_STORE_get0_objects(void)
5575655756
ExpectIntEQ(X509_STORE_add_crl(store_cpy, crl), WOLFSSL_SUCCESS);
5575755757

5575855758
ExpectNotNull(crl = X509_OBJECT_get0_X509_CRL(objCopy));
55759-
X509_CRL_free(crl);
5576055759
break;
5576155760
}
5576255761
#endif

wolfssl/internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2637,6 +2637,9 @@ struct WOLFSSL_CRL {
26372637
THREAD_TYPE tid; /* monitoring thread */
26382638
wolfSSL_CRL_mfd_t mfd;
26392639
int setup; /* thread is setup predicate */
2640+
#endif
2641+
#ifdef OPENSSL_ALL
2642+
wolfSSL_Ref ref;
26402643
#endif
26412644
void* heap; /* heap hint for dynamic memory */
26422645
};

0 commit comments

Comments
 (0)