forked from wolfSSL/wolfssl
Merge pull request #8499 from SparkiDev/crl_list_fix
CRL: fix memory allocation failure leaks
This commit is contained in:
34
src/crl.c
34
src/crl.c
@ -87,6 +87,13 @@ int InitCRL(WOLFSSL_CRL* crl, WOLFSSL_CERT_MANAGER* cm)
|
|||||||
WOLFSSL_MSG("Init Mutex failed");
|
WOLFSSL_MSG("Init Mutex failed");
|
||||||
return BAD_MUTEX_E;
|
return BAD_MUTEX_E;
|
||||||
}
|
}
|
||||||
|
#ifdef OPENSSL_ALL
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
wolfSSL_RefInit(&crl->ref, &ret);
|
||||||
|
(void)ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -213,7 +220,7 @@ static void CRL_Entry_free(CRL_Entry* crle, void* heap)
|
|||||||
|
|
||||||
WOLFSSL_ENTER("FreeCRL_Entry");
|
WOLFSSL_ENTER("FreeCRL_Entry");
|
||||||
|
|
||||||
while (tmp) {
|
while (tmp != NULL) {
|
||||||
next = tmp->next;
|
next = tmp->next;
|
||||||
XFREE(tmp, heap, DYNAMIC_TYPE_REVOKED);
|
XFREE(tmp, heap, DYNAMIC_TYPE_REVOKED);
|
||||||
tmp = next;
|
tmp = next;
|
||||||
@ -241,11 +248,24 @@ void FreeCRL(WOLFSSL_CRL* crl, int dynamic)
|
|||||||
{
|
{
|
||||||
CRL_Entry* tmp;
|
CRL_Entry* tmp;
|
||||||
|
|
||||||
|
WOLFSSL_ENTER("FreeCRL");
|
||||||
|
|
||||||
if (crl == NULL)
|
if (crl == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef OPENSSL_ALL
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int doFree = 0;
|
||||||
|
wolfSSL_RefDec(&crl->ref, &doFree, &ret);
|
||||||
|
if (ret != 0)
|
||||||
|
WOLFSSL_MSG("Couldn't lock x509 mutex");
|
||||||
|
if (!doFree)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
tmp = crl->crlList;
|
tmp = crl->crlList;
|
||||||
WOLFSSL_ENTER("FreeCRL");
|
|
||||||
#ifdef HAVE_CRL_MONITOR
|
#ifdef HAVE_CRL_MONITOR
|
||||||
if (crl->monitors[0].path)
|
if (crl->monitors[0].path)
|
||||||
XFREE(crl->monitors[0].path, crl->heap, DYNAMIC_TYPE_CRL_MONITOR);
|
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)
|
|||||||
|
|
||||||
#ifndef CRL_STATIC_REVOKED_LIST
|
#ifndef CRL_STATIC_REVOKED_LIST
|
||||||
dupl->certs = DupRevokedCertList(ent->certs, heap);
|
dupl->certs = DupRevokedCertList(ent->certs, heap);
|
||||||
|
if (ent->certs != NULL && dupl->certs == NULL) {
|
||||||
|
CRL_Entry_free(dupl, heap);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
dupl->issuer = wolfSSL_X509_NAME_dup(ent->issuer);
|
dupl->issuer = wolfSSL_X509_NAME_dup(ent->issuer);
|
||||||
|
if (ent->issuer != NULL && dupl->issuer == NULL) {
|
||||||
|
CRL_Entry_free(dupl, heap);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!ent->verified) {
|
if (!ent->verified) {
|
||||||
@ -1035,6 +1063,8 @@ static int DupX509_CRL(WOLFSSL_X509_CRL *dupl, const WOLFSSL_X509_CRL* crl)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
dupl->crlList = DupCRL_list(crl->crlList, dupl->heap);
|
dupl->crlList = DupCRL_list(crl->crlList, dupl->heap);
|
||||||
|
if (dupl->crlList == NULL)
|
||||||
|
return MEMORY_E;
|
||||||
#ifdef HAVE_CRL_IO
|
#ifdef HAVE_CRL_IO
|
||||||
dupl->crlIOCb = crl->crlIOCb;
|
dupl->crlIOCb = crl->crlIOCb;
|
||||||
#endif
|
#endif
|
||||||
|
@ -14092,6 +14092,11 @@ void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *obj)
|
|||||||
if (obj->type == WOLFSSL_X509_LU_X509) {
|
if (obj->type == WOLFSSL_X509_LU_X509) {
|
||||||
wolfSSL_X509_free(obj->data.x509);
|
wolfSSL_X509_free(obj->data.x509);
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_CRL
|
||||||
|
else if (obj->type == WOLFSSL_X509_LU_CRL) {
|
||||||
|
wolfSSL_X509_CRL_free(obj->data.crl);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else {
|
else {
|
||||||
/* We don't free as this will point to
|
/* We don't free as this will point to
|
||||||
* store->cm->crl which we don't own */
|
* store->cm->crl which we don't own */
|
||||||
|
@ -1912,6 +1912,7 @@ WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* wolfSSL_X509_STORE_get0_objects(
|
|||||||
|
|
||||||
#ifdef HAVE_CRL
|
#ifdef HAVE_CRL
|
||||||
if (store->cm->crl != NULL) {
|
if (store->cm->crl != NULL) {
|
||||||
|
int res;
|
||||||
obj = wolfSSL_X509_OBJECT_new();
|
obj = wolfSSL_X509_OBJECT_new();
|
||||||
if (obj == NULL) {
|
if (obj == NULL) {
|
||||||
WOLFSSL_MSG("wolfSSL_X509_OBJECT_new error");
|
WOLFSSL_MSG("wolfSSL_X509_OBJECT_new error");
|
||||||
@ -1923,6 +1924,11 @@ WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* wolfSSL_X509_STORE_get0_objects(
|
|||||||
goto err_cleanup;
|
goto err_cleanup;
|
||||||
}
|
}
|
||||||
obj->type = WOLFSSL_X509_LU_CRL;
|
obj->type = WOLFSSL_X509_LU_CRL;
|
||||||
|
wolfSSL_RefInc(&store->cm->crl->ref, &res);
|
||||||
|
if (res != 0) {
|
||||||
|
WOLFSSL_MSG("Failed to lock crl mutex");
|
||||||
|
goto err_cleanup;
|
||||||
|
}
|
||||||
obj->data.crl = store->cm->crl;
|
obj->data.crl = store->cm->crl;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -55756,7 +55756,6 @@ static int test_X509_STORE_get0_objects(void)
|
|||||||
ExpectIntEQ(X509_STORE_add_crl(store_cpy, crl), WOLFSSL_SUCCESS);
|
ExpectIntEQ(X509_STORE_add_crl(store_cpy, crl), WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
ExpectNotNull(crl = X509_OBJECT_get0_X509_CRL(objCopy));
|
ExpectNotNull(crl = X509_OBJECT_get0_X509_CRL(objCopy));
|
||||||
X509_CRL_free(crl);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -2637,6 +2637,9 @@ struct WOLFSSL_CRL {
|
|||||||
THREAD_TYPE tid; /* monitoring thread */
|
THREAD_TYPE tid; /* monitoring thread */
|
||||||
wolfSSL_CRL_mfd_t mfd;
|
wolfSSL_CRL_mfd_t mfd;
|
||||||
int setup; /* thread is setup predicate */
|
int setup; /* thread is setup predicate */
|
||||||
|
#endif
|
||||||
|
#ifdef OPENSSL_ALL
|
||||||
|
wolfSSL_Ref ref;
|
||||||
#endif
|
#endif
|
||||||
void* heap; /* heap hint for dynamic memory */
|
void* heap; /* heap hint for dynamic memory */
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user