dect
/
asterisk
Archived
13
0
Fork 0

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/
........


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@294086 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
bbryant 2010-11-05 22:17:16 +00:00
parent 5adacaa2de
commit 84474009fb
1 changed files with 10 additions and 18 deletions

View 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);
}
snprintf(clen, sizeof(clen), "%d", dialog->maxforwards);
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);
return add_header(req, "Max-Forwards", clen);
}
/*! \brief Add 'Content-Length' header and content to SIP message */