diff options
author | Richard Mudgett <rmudgett@digium.com> | 2011-01-20 20:35:50 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2011-01-20 20:35:50 +0000 |
commit | 9974f89a7d938070ceb61b964861a1dc8beab55f (patch) | |
tree | c18f28c97b515f2f0845d5b6ea8fd38e2dc52e34 /main/ccss.c | |
parent | 80f6848ca3545bcced471ceafacb1a79c0ed834b (diff) |
Merged revisions 303153 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8
................
r303153 | rmudgett | 2011-01-20 14:31:20 -0600 (Thu, 20 Jan 2011) | 22 lines
Merged revision 303098 from
https://origsvn.digium.com/svn/asterisk/be/branches/C.3-bier
..........
r303098 | rmudgett | 2011-01-20 12:11:45 -0600 (Thu, 20 Jan 2011) | 15 lines
CC_INTERFACES does not get built correctly with local channels.
If local channels are used with CCSS, CC_INTERFACES gets garbage prepended
to it so the CC recall fails. Also CC_INTERFACES gets "&(null)" appended
to it.
* Initialize the buffer to eliminate the prepended garbage.
* Filter out the empty interface strings to eliminate the latter.
* Added a diagnostic message if the CC_INTERFACES is ever empty.
JIRA ABE-2740
JIRA SWP-2848
..........
................
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@303154 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/ccss.c')
-rw-r--r-- | main/ccss.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/main/ccss.c b/main/ccss.c index 0b703b4cb..ce346f53e 100644 --- a/main/ccss.c +++ b/main/ccss.c @@ -3186,10 +3186,14 @@ struct ast_cc_monitor *ast_cc_get_monitor_by_recall_core_id(const int core_id, c * \param dialstring A new dialstring to add * \retval void */ -static void cc_unique_append(struct ast_str *str, const char * const dialstring) +static void cc_unique_append(struct ast_str *str, const char *dialstring) { char dialstring_search[AST_CHANNEL_NAME]; + if (ast_strlen_zero(dialstring)) { + /* No dialstring to append. */ + return; + } snprintf(dialstring_search, sizeof(dialstring_search), "%s%c", dialstring, '&'); if (strstr(ast_str_buffer(str), dialstring_search)) { return; @@ -3218,6 +3222,10 @@ static void build_cc_interfaces_chanvar(struct ast_cc_monitor *starting_point, s struct extension_child_dialstring *child_dialstring; struct ast_cc_monitor *monitor_iter = starting_point; int top_level_id = starting_point->id; + size_t length; + + /* Init to an empty string. */ + ast_str_truncate(str, 0); /* First we need to take all of the is_valid child_dialstrings from * the extension monitor we found and add them to the CC_INTERFACES @@ -3240,7 +3248,15 @@ static void build_cc_interfaces_chanvar(struct ast_cc_monitor *starting_point, s /* str will have an extra '&' tacked onto the end of it, so we need * to get rid of that. */ - ast_str_truncate(str, ast_str_strlen(str) - 1); + length = ast_str_strlen(str); + if (length) { + ast_str_truncate(str, length - 1); + } + if (length <= 1) { + /* Nothing to recall? This should not happen. */ + ast_log(LOG_ERROR, "CC_INTERFACES is empty. starting device_name:'%s'\n", + starting_point->interface->device_name); + } } int ast_cc_agent_set_interfaces_chanvar(struct ast_channel *chan) |