[svn-commits] trunk r25568 - /trunk/channels/chan_sip.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Mon May 8 07:45:29 MST 2006


Author: oej
Date: Mon May  8 09:45:28 2006
New Revision: 25568

URL: http://svn.digium.com/view/asterisk?rev=25568&view=rev
Log:
- Issue 7101 (mikma) - Don't crash with no From: header in pedantic mode
- Cleanup of get_destination
- Don't call uri_decode twice on the same string if you're in a rush ... :-)

Modified:
    trunk/channels/chan_sip.c

Modified: trunk/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_sip.c?rev=25568&r1=25567&r2=25568&view=diff
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Mon May  8 09:45:28 2006
@@ -6802,49 +6802,60 @@
 	return 0;
 }
 
-/*! \brief Find out who the call is for */
+/*! \brief Find out who the call is for 
+	We use the INVITE uri to find out
+*/
 static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
 {
 	char tmp[256] = "", *uri, *a;
-	char tmpf[256], *from;
+	char tmpf[256] = "", *from;
 	struct sip_request *req;
 	char *colon;
 	
 	req = oreq;
 	if (!req)
 		req = &p->initreq;
+
+	/* Find the request URI */
 	if (req->rlPart2)
 		ast_copy_string(tmp, req->rlPart2, sizeof(tmp));
 	uri = get_in_brackets(tmp);
 	
-	ast_copy_string(tmpf, get_header(req, "From"), sizeof(tmpf));
-	if (pedanticsipchecking) {
+	if (pedanticsipchecking)
 		ast_uri_decode(tmp);
-		ast_uri_decode(tmpf);
-	}
-
-	from = get_in_brackets(tmpf);
-	
+
 	if (strncmp(uri, "sip:", 4)) {
 		ast_log(LOG_WARNING, "Huh?  Not a SIP header (%s)?\n", uri);
 		return -1;
 	}
 	uri += 4;
+
+	/* Now find the From: caller ID and name */
+	ast_copy_string(tmpf, get_header(req, "From"), sizeof(tmpf));
+	if (!ast_strlen_zero(tmpf)) {
+		if (pedanticsipchecking)
+			ast_uri_decode(tmpf);
+		from = get_in_brackets(tmpf);
+	} else {
+		from = NULL;
+	}
+	
 	if (!ast_strlen_zero(from)) {
 		if (strncmp(from, "sip:", 4)) {
 			ast_log(LOG_WARNING, "Huh?  Not a SIP header (%s)?\n", from);
 			return -1;
 		}
 		from += 4;
-	} else
-		from = NULL;
-
-	if (pedanticsipchecking) {
-		ast_uri_decode(uri);
-		ast_uri_decode(from);
-	}
-
-	/* Skip any options */
+		if ((a = strchr(from, ';')))
+			*a = '\0';
+		if ((a = strchr(from, '@'))) {
+			*a = '\0';
+			ast_string_field_set(p, fromdomain, a + 1);
+		} else
+			ast_string_field_set(p, fromdomain, from);
+	}
+
+	/* Skip any options and find the domain */
 	if ((a = strchr(uri, ';')))
 		*a = '\0';
 
@@ -6879,19 +6890,12 @@
 			ast_string_field_set(p, context, domain_context);
 	}
 
-	if (from) {
-		if ((a = strchr(from, ';')))
-			*a = '\0';
-		if ((a = strchr(from, '@'))) {
-			*a = '\0';
-			ast_string_field_set(p, fromdomain, a + 1);
-		} else
-			ast_string_field_set(p, fromdomain, from);
-	}
 	if (sip_debug_test_pvt(p))
 		ast_verbose("Looking for %s in %s (domain %s)\n", uri, p->context, p->domain);
 
-	/* Return 0 if we have a matching extension */
+	/* Check the dialplan for the username part of the request URI,
+	   the domain will be stored in the SIPDOMAIN variable
+		Return 0 if we have a matching extension */
 	if (ast_exists_extension(NULL, p->context, uri, 1, from) ||
 		!strcmp(uri, ast_pickup_ext())) {
 		if (!oreq)
@@ -6899,9 +6903,10 @@
 		return 0;
 	}
 
-	/* Return 1 for overlap dialling support */
-	if (ast_canmatch_extension(NULL, p->context, uri, 1, from) ||
-	    !strncmp(uri, ast_pickup_ext(),strlen(uri))) {
+	/* Return 1 for pickup extension or overlap dialling support (if we support it) */
+	if((ast_test_flag(&global_flags[1], SIP_PAGE2_ALLOWOVERLAP) && 
+ 	    ast_canmatch_extension(NULL, p->context, uri, 1, from)) ||
+	    !strncmp(uri, ast_pickup_ext(), strlen(uri))) {
 		return 1;
 	}
 	



More information about the svn-commits mailing list