]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[Core] Fix leak of BIO_METHOD *dtls_bio_filter_methods in switch_rtp_add_dtls() 727/head
authorAndrey Volk <andywolk@gmail.com>
Thu, 9 Jul 2020 10:45:16 +0000 (14:45 +0400)
committerAndrey Volk <andywolk@gmail.com>
Thu, 9 Jul 2020 17:51:06 +0000 (21:51 +0400)
src/switch_rtp.c

index 080aee637a21e0f28eea9f24639657ac584522f4..c9485a3aff40442c51f0e7f89716152c8a756ed6 100644 (file)
@@ -270,6 +270,9 @@ typedef struct {
 
 struct switch_rtp;
 
+static void switch_rtp_dtls_init();
+static void switch_rtp_dtls_destroy();
+
 #define MAX_DTLS_MTU 4096
 
 typedef struct switch_dtls_s {
@@ -1530,6 +1533,7 @@ SWITCH_DECLARE(void) switch_rtp_init(switch_memory_pool_t *pool)
        srtp_init();
 #endif
        switch_mutex_init(&port_lock, SWITCH_MUTEX_NESTED, pool);
+       switch_rtp_dtls_init();
        global_init = 1;
 }
 
@@ -2519,7 +2523,7 @@ SWITCH_DECLARE(void) switch_rtp_shutdown(void)
 #ifdef ENABLE_SRTP
        srtp_crypto_kernel_shutdown();
 #endif
-
+       switch_rtp_dtls_destroy();
 }
 
 SWITCH_DECLARE(switch_port_t) switch_rtp_set_start_port(switch_port_t port)
@@ -3589,6 +3593,25 @@ static BIO_METHOD dtls_bio_filter_methods = {
 static BIO_METHOD *dtls_bio_filter_methods = NULL;
 #endif
 
+static void switch_rtp_dtls_init() {
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+       dtls_bio_filter_methods = BIO_meth_new(BIO_TYPE_FILTER | BIO_get_new_index(), "DTLS filter");
+       BIO_meth_set_write(dtls_bio_filter_methods, dtls_bio_filter_write);
+       BIO_meth_set_ctrl(dtls_bio_filter_methods, dtls_bio_filter_ctrl);
+       BIO_meth_set_create(dtls_bio_filter_methods, dtls_bio_filter_new);
+       BIO_meth_set_destroy(dtls_bio_filter_methods, dtls_bio_filter_free);
+#endif
+}
+
+static void switch_rtp_dtls_destroy() {
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+       if (dtls_bio_filter_methods) {
+               BIO_meth_free(dtls_bio_filter_methods);
+               dtls_bio_filter_methods = NULL;
+       }
+#endif
+}
+
 ///////////
 
 
@@ -3831,11 +3854,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, d
 #if OPENSSL_VERSION_NUMBER < 0x10100000L
        dtls->filter_bio = BIO_new(BIO_dtls_filter());
 #else
-       dtls_bio_filter_methods = BIO_meth_new(BIO_TYPE_FILTER | BIO_get_new_index(), "DTLS filter");
-       BIO_meth_set_write(dtls_bio_filter_methods, dtls_bio_filter_write);
-       BIO_meth_set_ctrl(dtls_bio_filter_methods, dtls_bio_filter_ctrl);
-       BIO_meth_set_create(dtls_bio_filter_methods, dtls_bio_filter_new);
-       BIO_meth_set_destroy(dtls_bio_filter_methods, dtls_bio_filter_free);
+       switch_assert(dtls_bio_filter_methods);
        dtls->filter_bio = BIO_new(dtls_bio_filter_methods);
 #endif