[asterisk-commits] dvossel: branch 1.6.0 r215687 - in /branches/1.6.0: ./ channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Sep 2 17:10:34 CDT 2009


Author: dvossel
Date: Wed Sep  2 17:10:31 2009
New Revision: 215687

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=215687
Log:
Merged revisions 215681 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

........
  r215681 | dvossel | 2009-09-02 16:39:31 -0500 (Wed, 02 Sep 2009) | 10 lines
  
  port string to int conversion using sscanf
  
  There are several instances where a port is parsed
  from a uri or some other source and converted to
  an int value using atoi(), if for some reason the
  port string is empty, then a standard port is used.
  This logic is used over and over, so I created a function
  to handle it in a safer way using sscanf().
........

Modified:
    branches/1.6.0/   (props changed)
    branches/1.6.0/channels/chan_sip.c

Propchange: branches/1.6.0/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.

Modified: branches/1.6.0/channels/chan_sip.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.0/channels/chan_sip.c?view=diff&rev=215687&r1=215686&r2=215687
==============================================================================
--- branches/1.6.0/channels/chan_sip.c (original)
+++ branches/1.6.0/channels/chan_sip.c Wed Sep  2 17:10:31 2009
@@ -2451,6 +2451,20 @@
 	return TRUE;
 }
 
+/*! \brief converts ascii port to int representation. If no
+ *  pt buffer is provided or the pt has errors when being converted
+ *  to an int value, the port provided as the standard is used.
+ */
+static int port_str2int(const char *pt, unsigned int standard)
+{
+	int port = standard;
+	if (ast_strlen_zero(pt) || (sscanf(pt, "%30d", &port) != 1) || (port < 0)) {
+		port = standard;
+	}
+
+	return port;
+}
+
 /*! \brief Allocate and initialize sip proxy */
 static struct sip_proxy *proxy_allocate(char *name, char *port, int force)
 {
@@ -2465,7 +2479,7 @@
 		return NULL;
 	proxy->force = force;
 	ast_copy_string(proxy->name, name, sizeof(proxy->name));
-	proxy->ip.sin_port = htons((!ast_strlen_zero(port) ? atoi(port) : STANDARD_SIP_PORT));
+	proxy->ip.sin_port = htons(port_str2int(port, STANDARD_SIP_PORT));
 	proxy_update(proxy);
 	return proxy;
 }
@@ -4366,7 +4380,7 @@
 		}
 	}
 	if (!portno)
-		portno = port ? atoi(port) : (dialog->socket.type & SIP_TRANSPORT_TLS) ? STANDARD_TLS_PORT : STANDARD_SIP_PORT;
+		portno = port_str2int(port, (dialog->socket.type == SIP_TRANSPORT_TLS) ? STANDARD_TLS_PORT : STANDARD_SIP_PORT);
 	hp = ast_gethostbyname(hostn, &ahp);
 	if (!hp) {
 		ast_log(LOG_WARNING, "No such host: %s\n", peername);
@@ -10348,15 +10362,15 @@
 	 * We still need to be able to send to the remote agent through the proxy.
 	*/
 
-	if (!parse_uri(contact, "sip,sips", &contact, NULL, &host, &pt, NULL, &transport)) {
-		if (((get_transport_str2enum(transport) == SIP_TRANSPORT_TLS)) ||
-			!(strncasecmp(fullcontact, "sips", 4))) {
-			port = !ast_strlen_zero(pt) ? atoi(pt) : STANDARD_TLS_PORT;
-		} else {
-			port = !ast_strlen_zero(pt) ? atoi(pt) : STANDARD_SIP_PORT;
-		}
+	if (parse_uri(contact, "sip,sips", &contact, NULL, &host, &pt, NULL, &transport)) {
+		ast_log(LOG_WARNING, "Invalid contact uri %s (missing sip: or sips:), attempting to use anyway\n", fullcontact);
+	}
+
+	/* set port */
+	if (((get_transport_str2enum(transport) == SIP_TRANSPORT_TLS)) || !(strncasecmp(fullcontact, "sips", 4))) {
+		port = port_str2int(pt, STANDARD_TLS_PORT);
 	} else {
-		ast_log(LOG_WARNING, "Invalid contact uri %s (missing sip: or sips:), attempting to use anyway\n", fullcontact);
+		port = port_str2int(pt, STANDARD_SIP_PORT);
 	}
 
 	/* XXX This could block for a long time XXX */
@@ -10469,13 +10483,10 @@
 		/* if the port is not specified but the transport is, make sure to set the
 		 * default port to match the specified transport.  This may or may not be the
 		 * same transport used by the pvt struct for the Register dialog. */
-		if (ast_strlen_zero(pt)) {
-			port = (transport_type == SIP_TRANSPORT_TLS) ? STANDARD_TLS_PORT : STANDARD_SIP_PORT;
-		} else {
-			port = atoi(pt);
-		}
+		
+		port = port_str2int(pt, (transport_type == SIP_TRANSPORT_TLS) ? STANDARD_TLS_PORT : STANDARD_SIP_PORT);
 	} else {
-		port = !ast_strlen_zero(pt) ? atoi(pt) : STANDARD_SIP_PORT;
+		port = port_str2int(pt, STANDARD_SIP_PORT);
 		transport_type = pvt->socket.type;
 	}
 
@@ -11885,7 +11896,7 @@
 		memset(&p->sa, 0, sizeof(p->sa));
 		p->sa.sin_family = AF_INET;
 		memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
-		p->sa.sin_port = htons(pt ? atoi(pt) : STANDARD_SIP_PORT);
+		p->sa.sin_port = htons(port_str2int(pt, STANDARD_SIP_PORT));
 
 		if (sip_debug_test_pvt(p)) {
 			const struct sockaddr_in *dst = sip_real_dst(p);




More information about the asterisk-commits mailing list