]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 189771 via svnmerge from
authorDavid Vossel <dvossel@digium.com>
Tue, 21 Apr 2009 20:42:55 +0000 (20:42 +0000)
committerDavid Vossel <dvossel@digium.com>
Tue, 21 Apr 2009 20:42:55 +0000 (20:42 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

........
  r189771 | dvossel | 2009-04-21 15:28:37 -0500 (Tue, 21 Apr 2009) | 11 lines

  Fixes segfault when switching UDP to TCP in sip.conf after reload.

  If transport in sip.conf is switched from UDP to TCP, Asterisk segfaults right after issuing a sip reload.  The problem is the socket type is changed to TCP but the fd may still be present for UDP.  Later, when the TCP session should be created or set using an existing one, it isn't because the old file descriptor is still present.  Now every time transport is changed during a sip.conf reload, the file descriptor is set to -1, signifying it must be created or found.

  (closes issue #14727)
  Reported by: pj
  Tested by: dvossel

  Review: http://reviewboard.digium.com/r/229/
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@189774 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index dc456ce68aca901285728843493afcadf596a135..18b13b1bfafbf6cd02b2e7a6eb8679e02b2a321e 100644 (file)
@@ -2875,14 +2875,18 @@ static int __sip_xmit(struct sip_pvt *p, struct ast_str *data, int len)
        if (p->socket.tcptls_session)
                ast_mutex_lock(&p->socket.tcptls_session->lock);
 
-       if (p->socket.type & SIP_TRANSPORT_UDP) 
+       if (p->socket.type & SIP_TRANSPORT_UDP) {
                res = sendto(p->socket.fd, data->str, len, 0, (const struct sockaddr *)dst, sizeof(struct sockaddr_in));
-       else {
-               if (p->socket.tcptls_session->f) 
+       } else if (p->socket.tcptls_session) {
+               if (p->socket.tcptls_session->f) {
                        res = ast_tcptls_server_write(p->socket.tcptls_session, data->str, len);
-               else
+               } else {
                        ast_debug(2, "No p->socket.tcptls_session->f len=%d\n", len);
-       } 
+               }
+       } else {
+               ast_debug(2, "Socket type is TCP but no tcptls_session is present to write to\n");
+               return XMIT_ERROR;
+       }
 
        if (p->socket.tcptls_session)
                ast_mutex_unlock(&p->socket.tcptls_session->lock);
@@ -21654,8 +21658,10 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
                                else
                                        ast_log(LOG_NOTICE, "'%s' is not a valid transport type. if no other is specified, udp will be used.\n", trans);
 
-                               if (!peer->socket.type) /*!< The first transport listed should be used for outgoing */
+                               if (!peer->socket.type) /*!< The first transport listed should be used for outgoing */
                                        peer->socket.type = peer->transports;
+                                       peer->socket.fd = -1;
+                               }
                        }
                } else if (realtime && !strcasecmp(v->name, "regseconds")) {
                        ast_get_time_t(v->value, &regseconds, 0, NULL);