summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Bright <sean.bright@gmail.com>2017-02-21 11:47:41 -0500
committerSean Bright <sean.bright@gmail.com>2017-02-22 05:31:22 -0600
commitca6d001144d56678f40ab2e625be143450dac693 (patch)
tree089ef9d3b1754b025a0385680f09848aa2bf00c1
parentd5522de597cc6fbbc9747fa6798144cd5d00cdb1 (diff)
pbx_realtime: Prevent premature extension matching
The patterns provided by pbx_realtime were checked in the order in which they were returned from the realtime backend. If there was overlap between multiple patterns, the first one to correctly match was chosen even though it may not have been the best match. We now sort the patterns descending by their length and compare in that order. There may be cases where this still results in a sub-optimal match, but this patch should improve the overall behavior. ASTERISK-18271 #close Reported by: Charlie Smurthwaite Change-Id: I56d9ac15810eb1775966b669c3028e32cc7bd809
-rw-r--r--pbx/pbx_realtime.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c
index 1d5800716..2b17cbcee 100644
--- a/pbx/pbx_realtime.c
+++ b/pbx/pbx_realtime.c
@@ -143,6 +143,13 @@ static void *cleanup(void *unused)
return NULL;
}
+static int extension_length_comparator(struct ast_category *p, struct ast_category *q)
+{
+ const char *extenp = S_OR(ast_variable_find(p, "exten"), "");
+ const char *extenq = S_OR(ast_variable_find(q, "exten"), "");
+
+ return strlen(extenp) - strlen(extenq);
+}
/* Realtime switch looks up extensions in the supplied realtime table.
@@ -193,6 +200,9 @@ static struct ast_variable *realtime_switch_common(const char *table, const char
if (cfg) {
char *cat = NULL;
+ /* Sort so that longer patterns are checked first */
+ ast_config_sort_categories(cfg, 1, extension_length_comparator);
+
while ((cat = ast_category_browse(cfg, cat))) {
const char *realtime_exten = ast_variable_retrieve(cfg, cat, "exten");