]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[Core] Fix double close of a socket in switch_rtp
authorAndrey Volk <andywolk@gmail.com>
Tue, 7 Jul 2020 14:00:35 +0000 (18:00 +0400)
committerAndrey Volk <andywolk@gmail.com>
Tue, 16 Mar 2021 19:15:33 +0000 (22:15 +0300)
src/switch_rtp.c

index e7aafd0482d72abad335d6bb70d8ffdc14e83554..e2e6dedc2d5c2b7fd4dc0924da16e721600c1ab7 100644 (file)
@@ -2991,7 +2991,7 @@ static void ping_socket(switch_rtp_t *rtp_session)
        switch_size_t len = sizeof(o);
        switch_socket_sendto(rtp_session->sock_input, rtp_session->local_addr, 0, (void *) &o, &len);
 
-       if (rtp_session->flags[SWITCH_RTP_FLAG_ENABLE_RTCP] && rtp_session->rtcp_sock_input) {
+       if (rtp_session->flags[SWITCH_RTP_FLAG_ENABLE_RTCP] && rtp_session->rtcp_sock_input && rtp_session->rtcp_sock_input != rtp_session->sock_input) {
                switch_socket_sendto(rtp_session->rtcp_sock_input, rtp_session->rtcp_local_addr, 0, (void *) &o, &len);
        }
 }
@@ -5077,11 +5077,11 @@ SWITCH_DECLARE(void) switch_rtp_kill_socket(switch_rtp_t *rtp_session)
                }
 
                if (rtp_session->flags[SWITCH_RTP_FLAG_ENABLE_RTCP]) {
-                       if (rtp_session->rtcp_sock_input) {
+                       if (rtp_session->rtcp_sock_input && rtp_session->rtcp_sock_input != rtp_session->sock_input) {
                                ping_socket(rtp_session);
                                switch_socket_shutdown(rtp_session->rtcp_sock_input, SWITCH_SHUTDOWN_READWRITE);
                        }
-                       if (rtp_session->rtcp_sock_output && rtp_session->rtcp_sock_output != rtp_session->rtcp_sock_input) {
+                       if (rtp_session->rtcp_sock_output && rtp_session->rtcp_sock_output != rtp_session->sock_output && rtp_session->rtcp_sock_output != rtp_session->rtcp_sock_input) {
                                switch_socket_shutdown(rtp_session->rtcp_sock_output, SWITCH_SHUTDOWN_READWRITE);
                        }
                }
@@ -5197,6 +5197,13 @@ SWITCH_DECLARE(void) switch_rtp_destroy(switch_rtp_t **rtp_session)
                free_dtls(&(*rtp_session)->rtcp_dtls);
        }
 
+       if ((*rtp_session)->rtcp_sock_input == (*rtp_session)->sock_input) {
+               (*rtp_session)->rtcp_sock_input = NULL;
+       }
+
+       if ((*rtp_session)->rtcp_sock_output == (*rtp_session)->sock_output) {
+               (*rtp_session)->rtcp_sock_output = NULL;
+       }
 
        sock = (*rtp_session)->sock_input;
        (*rtp_session)->sock_input = NULL;
@@ -5211,13 +5218,12 @@ SWITCH_DECLARE(void) switch_rtp_destroy(switch_rtp_t **rtp_session)
        if ((sock = (*rtp_session)->rtcp_sock_input)) {
                (*rtp_session)->rtcp_sock_input = NULL;
                switch_socket_close(sock);
+       }
 
-               if ((*rtp_session)->rtcp_sock_output && (*rtp_session)->rtcp_sock_output != sock) {
-                       if ((sock = (*rtp_session)->rtcp_sock_output)) {
-                               (*rtp_session)->rtcp_sock_output = NULL;
-                               switch_socket_close(sock);
-                       }
-               }
+       if ((*rtp_session)->rtcp_sock_output && (*rtp_session)->rtcp_sock_output != sock) {
+               sock = (*rtp_session)->rtcp_sock_output;
+               (*rtp_session)->rtcp_sock_output = NULL;
+               switch_socket_close(sock);
        }
 
 #ifdef ENABLE_SRTP