@@ -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 */
832822int GetCRLInfo (WOLFSSL_CRL * crl , CrlInfo * info , const byte * buff ,
0 commit comments