summaryrefslogtreecommitdiff
path: root/main/pbx.c
diff options
context:
space:
mode:
authorJonathan Rose <jrose@digium.com>2011-12-05 15:04:12 +0000
committerJonathan Rose <jrose@digium.com>2011-12-05 15:04:12 +0000
commitc5fe1cfdc09180b152ffb4d3dd53b1775b988750 (patch)
treed7a4ef8c426241595e0b7c48dfc42b35b620ef26 /main/pbx.c
parentae61df53f149bcfddf66c1e3235ae82f5f9876eb (diff)
Resolve duplicate label used in multiple priorities for the same extension.
Prior to this patch, if labels with the same name were used for different priorities in the same extension, the new label would be accepted, but it would be unusable since attempts to reach that label would just go to the first one. Now pbx.c detects this, generates a warning in logs, and culls the label before adding it to the dialplan. (closes issue ASTERISK-18807) Reported by: Kenneth Shumard Patches: pbx.c.patch uploaded by Kenneth Shumard (License 5077) ........ Merged revisions 346954 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 346955 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@346956 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/pbx.c')
-rw-r--r--main/pbx.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/main/pbx.c b/main/pbx.c
index e0fd8f44d..c80185d20 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -8276,11 +8276,23 @@ static int add_priority(struct ast_context *con, struct ast_exten *tmp,
{
struct ast_exten *ep;
struct ast_exten *eh=e;
+ int repeated_label = 0; /* Track if this label is a repeat, assume no. */
for (ep = NULL; e ; ep = e, e = e->peer) {
- if (e->priority >= tmp->priority)
+ if (e->label && tmp->label && e->priority != tmp->priority && !strcmp(e->label, tmp->label)) {
+ ast_log(LOG_WARNING, "Extension '%s', priority %d in '%s', label '%s' already in use at "
+ "priority %d\n", tmp->exten, tmp->priority, con->name, tmp->label, e->priority);
+ repeated_label = 1;
+ }
+ if (e->priority >= tmp->priority) {
break;
+ }
}
+
+ if (repeated_label) { /* Discard the label since it's a repeat. */
+ tmp->label = NULL;
+ }
+
if (!e) { /* go at the end, and ep is surely set because the list is not empty */
ast_hashtab_insert_safe(eh->peer_table, tmp);