[asterisk-commits] dvossel: trunk r189771 - /trunk/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Apr 21 15:28:42 CDT 2009


Author: dvossel
Date: Tue Apr 21 15:28:37 2009
New Revision: 189771

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=189771
Log:
Fixes segfault when switching upd to tcp in sip.conf after reload.

If transport in sip.conf is switched from upd 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/


Modified:
    trunk/channels/chan_sip.c

Modified: trunk/channels/chan_sip.c
URL: http://svn.digium.com/svn-view/asterisk/trunk/channels/chan_sip.c?view=diff&rev=189771&r1=189770&r2=189771
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Tue Apr 21 15:28:37 2009
@@ -3313,14 +3313,18 @@
 	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);
@@ -10499,7 +10503,7 @@
 			ast_str_append(tmp, 0, "<dialog id=\"%s\">", exten);
 		}
 		ast_str_append(tmp, 0, "<state>%s</state>\n", statestring);
-		if (state == AST_EXTENSION_ONHOLD) { //todohere, this seems weird
+		if (state == AST_EXTENSION_ONHOLD) {
 				ast_str_append(tmp, 0, "<local>\n<target uri=\"%s\">\n"
 			                                    "<param pname=\"+sip.rendering\" pvalue=\"no\"/>\n"
 			                                    "</target>\n</local>\n", mto);
@@ -23276,8 +23280,10 @@
 				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);
@@ -23577,9 +23583,10 @@
 
 	if (!peer->socket.type) {
 		/* Set default set of transports */
-		peer->transports  = default_transports;
+		peer->transports = default_transports;
 		/* Set default primary transport */
 		peer->socket.type = default_primary_transport;
+		peer->socket.fd = -1;
 	}
 
 	if (fullcontact->used > 0) {




More information about the asterisk-commits mailing list