[asterisk-commits] rmudgett: branch 11 r413139 - in /branches/11: channels/ include/asterisk/ main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Apr 30 15:26:25 CDT 2014
Author: rmudgett
Date: Wed Apr 30 15:26:16 2014
New Revision: 413139
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=413139
Log:
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.
Modified:
branches/11/channels/chan_sip.c
branches/11/include/asterisk/message.h
branches/11/main/message.c
Modified: branches/11/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/channels/chan_sip.c?view=diff&rev=413139&r1=413138&r2=413139
==============================================================================
--- branches/11/channels/chan_sip.c (original)
+++ branches/11/channels/chan_sip.c Wed Apr 30 15:26:16 2014
@@ -26995,12 +26995,11 @@
return -1;
}
- for (iter = ast_msg_var_iterator_init(msg);
- ast_msg_var_iterator_next(msg, iter, &var, &val);
- ast_msg_var_unref_current(iter)) {
+ for (iter = ast_msg_var_iterator_init(msg);
+ ast_msg_var_iterator_next(msg, iter, &var, &val);
+ ast_msg_var_unref_current(iter)) {
if (!strcasecmp(var, "Request-URI")) {
ast_string_field_set(pvt, fullcontact, val);
- ast_msg_var_unref_current(iter);
break;
}
}
@@ -27085,6 +27084,7 @@
if (!strcasecmp(var, "Max-Forwards")) {
/* Decrement Max-Forwards for SIP loop prevention. */
if (sscanf(val, "%30d", &pvt->maxforwards) != 1 || pvt->maxforwards < 1) {
+ ast_msg_var_iterator_destroy(iter);
sip_pvt_unlock(pvt);
dialog_unlink_all(pvt);
dialog_unref(pvt, "MESSAGE(Max-Forwards) reached zero.");
Modified: branches/11/include/asterisk/message.h
URL: http://svnview.digium.com/svn/asterisk/branches/11/include/asterisk/message.h?view=diff&rev=413139&r1=413138&r2=413139
==============================================================================
--- branches/11/include/asterisk/message.h (original)
+++ branches/11/include/asterisk/message.h Wed Apr 30 15:26:16 2014
@@ -167,6 +167,7 @@
* \brief Set a variable on the message going to the dialplan.
* \note Setting a variable that already exists overwrites the existing variable value
*
+ * \param msg
* \param name Name of variable to set
* \param value Value of variable to set
*
@@ -179,6 +180,7 @@
* \brief Set a variable on the message being sent to a message tech directly.
* \note Setting a variable that already exists overwrites the existing variable value
*
+ * \param msg
* \param name Name of variable to set
* \param value Value of variable to set
*
@@ -244,25 +246,25 @@
/*!
* \brief Get the next variable name and value that is set for sending outbound
* \param msg The message with the variables
- * \param i An iterator created with ast_msg_var_iterator_init
+ * \param iter An iterator created with ast_msg_var_iterator_init
* \param name A pointer to the name result pointer
* \param value A pointer to the value result pointer
*
* \retval 0 No more entries
* \retval 1 Valid entry
*/
-int ast_msg_var_iterator_next(const struct ast_msg *msg, struct ast_msg_var_iterator *i, const char **name, const char **value);
+int ast_msg_var_iterator_next(const struct ast_msg *msg, struct ast_msg_var_iterator *iter, const char **name, const char **value);
/*!
* \brief Destroy a message variable iterator
- * \param i Iterator to be destroyed
- */
-void ast_msg_var_iterator_destroy(struct ast_msg_var_iterator *i);
+ * \param iter Iterator to be destroyed
+ */
+void ast_msg_var_iterator_destroy(struct ast_msg_var_iterator *iter);
/*!
* \brief Unref a message var from inside an iterator loop
*/
-void ast_msg_var_unref_current(struct ast_msg_var_iterator *i);
+void ast_msg_var_unref_current(struct ast_msg_var_iterator *iter);
#if defined(__cplusplus) || defined(c_plusplus)
}
Modified: branches/11/main/message.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/main/message.c?view=diff&rev=413139&r1=413138&r2=413139
==============================================================================
--- branches/11/main/message.c (original)
+++ branches/11/main/message.c Wed Apr 30 15:26:16 2014
@@ -606,28 +606,34 @@
}
struct ast_msg_var_iterator {
- struct ao2_iterator i;
+ struct ao2_iterator iter;
struct msg_data *current_used;
};
struct ast_msg_var_iterator *ast_msg_var_iterator_init(const struct ast_msg *msg)
{
- struct ast_msg_var_iterator *i;
- if (!(i = ast_calloc(1, sizeof(*i)))) {
- return NULL;
- }
-
- i->i = ao2_iterator_init(msg->vars, 0);
-
- return i;
-}
-
-int ast_msg_var_iterator_next(const struct ast_msg *msg, struct ast_msg_var_iterator *i, const char **name, const char **value)
+ struct ast_msg_var_iterator *iter;
+
+ iter = ast_calloc(1, sizeof(*iter));
+ if (!iter) {
+ return NULL;
+ }
+
+ iter->iter = ao2_iterator_init(msg->vars, 0);
+
+ return iter;
+}
+
+int ast_msg_var_iterator_next(const struct ast_msg *msg, struct ast_msg_var_iterator *iter, const char **name, const char **value)
{
struct msg_data *data;
+ if (!iter) {
+ return 0;
+ }
+
/* Skip any that aren't marked for sending out */
- while ((data = ao2_iterator_next(&i->i)) && !data->send) {
+ while ((data = ao2_iterator_next(&iter->iter)) && !data->send) {
ao2_ref(data, -1);
}
@@ -642,22 +648,24 @@
/* Leave the refcount to be cleaned up by the caller with
* ast_msg_var_unref_current after they finish with the pointers to the data */
- i->current_used = data;
+ iter->current_used = data;
return 1;
}
-void ast_msg_var_unref_current(struct ast_msg_var_iterator *i) {
- if (i->current_used) {
- ao2_ref(i->current_used, -1);
- }
- i->current_used = NULL;
-}
-
-void ast_msg_var_iterator_destroy(struct ast_msg_var_iterator *i)
-{
- ao2_iterator_destroy(&i->i);
- ast_free(i);
+void ast_msg_var_unref_current(struct ast_msg_var_iterator *iter)
+{
+ ao2_cleanup(iter->current_used);
+ iter->current_used = NULL;
+}
+
+void ast_msg_var_iterator_destroy(struct ast_msg_var_iterator *iter)
+{
+ if (iter) {
+ ao2_iterator_destroy(&iter->iter);
+ ast_msg_var_unref_current(iter);
+ ast_free(iter);
+ }
}
static struct ast_channel *create_msg_q_chan(void)
@@ -1321,10 +1329,14 @@
}
}
-/*! \internal \brief Clean up other resources on Asterisk shutdown
+/*!
+ * \internal
+ * \brief Clean up other resources on Asterisk shutdown
+ *
* \note This does not include the msg_q_tp object, which must be disposed
* of prior to Asterisk checking for channel destruction in its shutdown
- * sequence. The atexit handlers are executed after this occurs. */
+ * sequence. The atexit handlers are executed after this occurs.
+ */
static void message_shutdown(void)
{
ast_custom_function_unregister(&msg_function);
More information about the asterisk-commits
mailing list