]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_sip: TCP/TLS client without server.
authortraud <pabstraud@compuserve.com>
Wed, 1 Apr 2020 16:52:58 +0000 (18:52 +0200)
committerFriendly Automation <jenkins2@gerrit.asterisk.org>
Mon, 13 Apr 2020 21:38:43 +0000 (16:38 -0500)
It is possible to configure a TCP/TLS client without having a TCP/TLS
server. In that case, no error or warning was printed but the headers
Contact and Via in SIP REGISTER were "(null)".

ASTERISK-28798

Change-Id: I387ca5cb6a65f1eb675a29c5e41df8ec6c242ab2

channels/chan_sip.c

index fb3581eb5168733b8aff144e5e4e25a3a0948243..078cf102f10d9c3264a0001914e529157961536f 100644 (file)
@@ -3934,23 +3934,27 @@ static void ast_sip_ouraddrfor(const struct ast_sockaddr *them, struct ast_socka
                /* no remapping, but we bind to a specific address, so use it. */
                switch (p->socket.type) {
                case AST_TRANSPORT_TCP:
-                       if (!ast_sockaddr_is_any(&sip_tcp_desc.local_address)) {
-                               ast_sockaddr_copy(us,
-                                                 &sip_tcp_desc.local_address);
-                       } else {
-                               ast_sockaddr_set_port(us,
-                                                     ast_sockaddr_port(&sip_tcp_desc.local_address));
-                       }
-                       break;
+                       if (!ast_sockaddr_isnull(&sip_tcp_desc.local_address)) {
+                               if (!ast_sockaddr_is_any(&sip_tcp_desc.local_address)) {
+                                       ast_sockaddr_copy(us,
+                                                         &sip_tcp_desc.local_address);
+                               } else {
+                                       ast_sockaddr_set_port(us,
+                                         ast_sockaddr_port(&sip_tcp_desc.local_address));
+                               }
+                               break;
+                       } /* fall through on purpose */
                case AST_TRANSPORT_TLS:
-                       if (!ast_sockaddr_is_any(&sip_tls_desc.local_address)) {
-                               ast_sockaddr_copy(us,
-                                                 &sip_tls_desc.local_address);
-                       } else {
-                               ast_sockaddr_set_port(us,
-                                                     ast_sockaddr_port(&sip_tls_desc.local_address));
-                       }
-                       break;
+                       if (!ast_sockaddr_isnull(&sip_tls_desc.local_address)) {
+                               if (!ast_sockaddr_is_any(&sip_tls_desc.local_address)) {
+                                       ast_sockaddr_copy(us,
+                                                         &sip_tls_desc.local_address);
+                               } else {
+                                       ast_sockaddr_set_port(us,
+                                         ast_sockaddr_port(&sip_tls_desc.local_address));
+                               }
+                               break;
+                       } /* fall through on purpose */
                case AST_TRANSPORT_UDP:
                        /* fall through on purpose */
                default:
@@ -16249,8 +16253,15 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char *
                /* Set transport and port so the correct contact is built */
                set_socket_transport(&p->socket, r->transport);
                if (r->transport == AST_TRANSPORT_TLS || r->transport == AST_TRANSPORT_TCP) {
-                       p->socket.port =
-                           htons(ast_sockaddr_port(&sip_tcp_desc.local_address));
+                       if (ast_sockaddr_isnull(&sip_tcp_desc.local_address)) {
+                               ast_log(LOG_ERROR,
+                                   "TCP/TLS clients without server were not tested.\n");
+                               ast_log(LOG_ERROR,
+                                   "Please, follow-up and report at issue 28798.\n");
+                       } else {
+                               p->socket.port =
+                                   htons(ast_sockaddr_port(&sip_tcp_desc.local_address));
+                       }
                }
 
                /*