Skip to content

Commit 3f8efdc

Browse files
authored
Merge pull request #9600 from padelsbach/addcrl-cleanup
Cleanup AddCRL mutex and alloc/free
2 parents ce69f1c + e62c94d commit 3f8efdc

File tree

1 file changed

+16
-26
lines changed

1 file changed

+16
-26
lines changed

src/crl.c

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -659,11 +659,10 @@ static int CompareCRLnumber(CRL_Entry* prev, CRL_Entry* curr)
659659
return ret;
660660
}
661661

662-
/* Add Decoded CRL, 0 on success */
663-
static int AddCRL(WOLFSSL_CRL* crl, DecodedCRL* dcrl, const byte* buff,
664-
int verified)
662+
/* Add or replace a decoded CRL, 0 on success */
663+
static int AddCRL(WOLFSSL_CRL* crl, DecodedCRL* dcrl, CRL_Entry* crle,
664+
const byte* buff, int verified)
665665
{
666-
CRL_Entry* crle = NULL;
667666
CRL_Entry* curr = NULL;
668667
CRL_Entry* prev = NULL;
669668
#ifdef HAVE_CRL_UPDATE_CB
@@ -677,25 +676,13 @@ static int AddCRL(WOLFSSL_CRL* crl, DecodedCRL* dcrl, const byte* buff,
677676
if (crl == NULL)
678677
return WOLFSSL_FATAL_ERROR;
679678

680-
crle = crl->currentEntry;
681-
682-
if (crle == NULL) {
683-
crle = CRL_Entry_new(crl->heap);
684-
if (crle == NULL) {
685-
WOLFSSL_MSG("alloc CRL Entry failed");
686-
return MEMORY_E;
687-
}
688-
}
689-
690679
if (InitCRL_Entry(crle, dcrl, buff, verified, crl->heap) < 0) {
691680
WOLFSSL_MSG("Init CRL Entry failed");
692-
CRL_Entry_free(crle, crl->heap);
693681
return WOLFSSL_FATAL_ERROR;
694682
}
695683

696684
if (wc_LockRwLock_Wr(&crl->crlLock) != 0) {
697685
WOLFSSL_MSG("wc_LockRwLock_Wr failed");
698-
CRL_Entry_free(crle, crl->heap);
699686
return BAD_MUTEX_E;
700687
}
701688

@@ -706,15 +693,16 @@ static int AddCRL(WOLFSSL_CRL* crl, DecodedCRL* dcrl, const byte* buff,
706693
* authoritative than the existing entry */
707694
if (ret == MP_LT || ret == MP_EQ) {
708695
WOLFSSL_MSG("Same or newer CRL entry already exists");
709-
CRL_Entry_free(crle, crl->heap);
710696
wc_UnLockRwLock(&crl->crlLock);
711697
return BAD_FUNC_ARG;
712698
}
713699
else if (ret < 0) {
714700
WOLFSSL_MSG("Error comparing CRL Numbers");
701+
wc_UnLockRwLock(&crl->crlLock);
715702
return ret;
716703
}
717704

705+
/* Insert the new entry after the current entry. */
718706
crle->next = curr->next;
719707
if (prev != NULL) {
720708
prev->next = crle;
@@ -731,22 +719,21 @@ static int AddCRL(WOLFSSL_CRL* crl, DecodedCRL* dcrl, const byte* buff,
731719
}
732720
#endif
733721

722+
/* Remove the current entry which was replaced */
723+
CRL_Entry_free(curr, crl->heap);
724+
734725
break;
735726
}
736727
prev = curr;
737728
}
738729

739-
if (curr != NULL) {
740-
CRL_Entry_free(curr, crl->heap);
741-
}
742-
else {
730+
if (curr == NULL) {
731+
/* No replacement occurred, prepend the new entry. */
743732
crle->next = crl->crlList;
744733
crl->crlList = crle;
745734
}
746-
wc_UnLockRwLock(&crl->crlLock);
747-
/* Avoid heap-use-after-free after crl->crlList is released */
748-
crl->currentEntry = NULL;
749735

736+
wc_UnLockRwLock(&crl->crlLock);
750737
return 0;
751738
}
752739

@@ -810,12 +797,14 @@ int BufferLoadCRL(WOLFSSL_CRL* crl, const byte* buff, long sz, int type,
810797
crl->currentEntry = NULL;
811798
}
812799
else {
813-
ret = AddCRL(crl, dcrl, myBuffer,
800+
ret = AddCRL(crl, dcrl, crl->currentEntry, myBuffer,
814801
ret != WC_NO_ERR_TRACE(ASN_CRL_NO_SIGNER_E));
815802
if (ret != 0) {
816803
WOLFSSL_MSG_CERT_LOG("AddCRL error");
817-
crl->currentEntry = NULL;
804+
CRL_Entry_free(crl->currentEntry, crl->heap);
818805
}
806+
/* Entry now is in the list, or has been freed due to error */
807+
crl->currentEntry = NULL;
819808
}
820809

821810
FreeDecodedCRL(dcrl);
@@ -827,6 +816,7 @@ int BufferLoadCRL(WOLFSSL_CRL* crl, const byte* buff, long sz, int type,
827816
return ret ? ret : WOLFSSL_SUCCESS; /* convert 0 to WOLFSSL_SUCCESS */
828817
}
829818

819+
830820
#ifdef HAVE_CRL_UPDATE_CB
831821
/* Fill out CRL info structure, WOLFSSL_SUCCESS on ok */
832822
int GetCRLInfo(WOLFSSL_CRL* crl, CrlInfo* info, const byte* buff,

0 commit comments

Comments
 (0)