]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 294084 via svnmerge from
authorBrett Bryant <bbryant@digium.com>
Fri, 5 Nov 2010 22:17:16 +0000 (22:17 +0000)
committerBrett Bryant <bbryant@digium.com>
Fri, 5 Nov 2010 22:17:16 +0000 (22:17 +0000)
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/
........

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

channels/chan_sip.c

index a3d1ef61fb746a0fd6d1cd8a8399910b38e0f935..42a734f8c72879edd590e0b2be1cce14a3d76053 100644 (file)
@@ -5177,6 +5177,10 @@ static int sip_call(struct ast_channel *ast, char *dest, int timeout)
                } 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 @@ static int add_header(struct sip_request *req, const char *var, const char *valu
        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);
-       }
+       snprintf(clen, sizeof(clen), "%d", dialog->maxforwards);
 
-       /* 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);
+       return add_header(req, "Max-Forwards", clen);
 }
 
 /*! \brief Add 'Content-Length' header and content to SIP message */