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:26:26 +0000 (10:26 +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)

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

index cc41eee9762d403568e86c53c863afb3e45a34ed..62c5f26e5d13126baf72cbcc82da190bc97adeff 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 cc412bae3751a3c73de654837c51b1e37096555b..10321ce0159c2be8aa004946a213bf25ca71e65d 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);