mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
chan_sip.c: Fixed off-nominal message iterator ref count and alloc fail issues.
* Fixed early exit in sip_msg_send() not destroying the message iterator. * Made ast_msg_var_iterator_next() and ast_msg_var_iterator_destroy() tolerant of a NULL iter parameter in case ast_msg_var_iterator_init() fails. * Made ast_msg_var_iterator_destroy() clean up any current message data ref. * Made struct ast_msg_var_iterator, ast_msg_var_iterator_init(), ast_msg_var_iterator_next(), ast_msg_var_unref_current(), and ast_msg_var_iterator_destroy() use iter instead of i. * Eliminated RAII_VAR usage in res_pjsip_messaging.c:vars_to_headers(). ........ Merged revisions 413139 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 413142 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@413144 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -318,22 +318,26 @@ static enum pjsip_status_code vars_to_headers(const struct ast_msg *msg, pjsip_t
|
||||
const char *name;
|
||||
const char *value;
|
||||
int max_forwards;
|
||||
struct ast_msg_var_iterator *iter;
|
||||
|
||||
RAII_VAR(struct ast_msg_var_iterator *, i, ast_msg_var_iterator_init(msg), ast_msg_var_iterator_destroy);
|
||||
while (ast_msg_var_iterator_next(msg, i, &name, &value)) {
|
||||
for (iter = ast_msg_var_iterator_init(msg);
|
||||
ast_msg_var_iterator_next(msg, iter, &name, &value);
|
||||
ast_msg_var_unref_current(iter)) {
|
||||
if (!strcasecmp(name, "Max-Forwards")) {
|
||||
/* Decrement Max-Forwards for SIP loop prevention. */
|
||||
if (sscanf(value, "%30d", &max_forwards) != 1 || --max_forwards == 0) {
|
||||
ast_msg_var_iterator_destroy(iter);
|
||||
ast_log(LOG_NOTICE, "MESSAGE(Max-Forwards) reached zero. MESSAGE not sent.\n");
|
||||
return -1;
|
||||
}
|
||||
sprintf((char*)value, "%d", max_forwards);
|
||||
sprintf((char *) value, "%d", max_forwards);
|
||||
ast_sip_add_header(tdata, name, value);
|
||||
} else if (!is_msg_var_blocked(name)) {
|
||||
ast_sip_add_header(tdata, name, value);
|
||||
}
|
||||
ast_msg_var_unref_current(i);
|
||||
}
|
||||
ast_msg_var_iterator_destroy(iter);
|
||||
|
||||
return PJSIP_SC_OK;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user