[asterisk-commits] bbryant: trunk r294086 - in /trunk: ./ channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Nov 5 17:17:28 CDT 2010


Author: bbryant
Date: Fri Nov  5 17:17:16 2010
New Revision: 294086

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=294086
Log:
Merged revisions 294084 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r294084 | bbryant | 2010-11-05 18:03:11 -0400 (Fri, 05 Nov 2010) | 9 lines
  
  Fixed deadlock avoidance issues while locking channel when adding the
  Max-Forwards header to a request.
  
  (closes issue #17949)
  (closes issue #18200)
  Reported by: bwg
  
  Review: https://reviewboard.asterisk.org/r/997/
........

Modified:
    trunk/   (props changed)
    trunk/channels/chan_sip.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Modified: trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_sip.c?view=diff&rev=294086&r1=294085&r2=294086
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Fri Nov  5 17:17:16 2010
@@ -5177,6 +5177,10 @@
 		} else if (!strcasecmp(ast_var_name(current), "SIPTRANSFER_REPLACES")) {
 			/* We're replacing a call. */
 			p->options->replaces = ast_var_value(current);
+		} else if (!strcasecmp(ast_var_name(current), "SIP_MAX_FORWARDS")) {
+			if (sscanf(ast_var_value(current), "%d", &(p->maxforwards)) != 1) {
+				ast_log(LOG_WARNING, "The SIP_MAX_FORWARDS channel variable is not a valid integer.");
+			}
 		}
 	}
 
@@ -9231,29 +9235,17 @@
 	return 0;	
 }
 
-/*! \brief Add 'Max-Forwards' header to SIP message */
+/*! 
+ * \pre dialog is assumed to be locked while calling this function
+ * \brief Add 'Max-Forwards' header to SIP message 
+ */
 static int add_header_max_forwards(struct sip_pvt *dialog, struct sip_request *req)
 {
 	char clen[10];
-	const char *max = NULL;
-
-	/* deadlock avoidance */
-	while (dialog->owner && ast_channel_trylock(dialog->owner)) {
-		sip_pvt_unlock(dialog);
-		usleep(1);
-		sip_pvt_lock(dialog);
-	}
-
-	if (dialog->owner) {
- 		max = pbx_builtin_getvar_helper(dialog->owner, "SIP_MAX_FORWARDS");
-		ast_channel_unlock(dialog->owner);
-	}
-
-	/* The channel variable overrides the peer/channel value */
-	if (max == NULL) {
-		snprintf(clen, sizeof(clen), "%d", dialog->maxforwards);
-	}
-	return add_header(req, "Max-Forwards", max != NULL ? max : clen);
+
+	snprintf(clen, sizeof(clen), "%d", dialog->maxforwards);
+
+	return add_header(req, "Max-Forwards", clen);
 }
 
 /*! \brief Add 'Content-Length' header and content to SIP message */




More information about the asterisk-commits mailing list