Ensure DTLS free functions can handle NULL
authorMatt Caswell <matt@openssl.org>
Thu, 10 Dec 2020 10:36:23 +0000 (10:36 +0000)
committerMatt Caswell <matt@openssl.org>
Fri, 8 Jan 2021 10:36:53 +0000 (10:36 +0000)
Our free functions should be able to deal with the case where the object
being freed is NULL. This turns out to not be quite the case for DTLS
related objects.

Fixes #13649

Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
(Merged from https://github.com/openssl/openssl/pull/13655)

(cherry picked from commit d0afb30ef3950cacff50ec539e90073b95a276df)

ssl/d1_lib.c
ssl/record/rec_layer_d1.c

index 2a15ee8ad9654fa041e659ddd31fbf383db25933..8874bed353df139b5747a71006202ab65e267e1a 100644 (file)
@@ -142,10 +142,11 @@ void dtls1_free(SSL *s)
 
     ssl3_free(s);
 
-    dtls1_clear_queues(s);
-
-    pqueue_free(s->d1->buffered_messages);
-    pqueue_free(s->d1->sent_messages);
+    if (s->d1 != NULL) {
+        dtls1_clear_queues(s);
+        pqueue_free(s->d1->buffered_messages);
+        pqueue_free(s->d1->sent_messages);
+    }
 
     OPENSSL_free(s->d1);
     s->d1 = NULL;
index e56c6b95958fbb2678a51d5861b538a1c06d315d..d0cb72d757027abea9bcbaad69edab55defd3632 100644 (file)
@@ -46,6 +46,9 @@ int DTLS_RECORD_LAYER_new(RECORD_LAYER *rl)
 
 void DTLS_RECORD_LAYER_free(RECORD_LAYER *rl)
 {
+    if (rl->d == NULL)
+        return;
+
     DTLS_RECORD_LAYER_clear(rl);
     pqueue_free(rl->d->unprocessed_rcds.q);
     pqueue_free(rl->d->processed_rcds.q);