From 78d37b9cdde1ce5fa0e5d50008112d6d6e4c1c15 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Tue, 21 Feb 2017 11:47:41 -0500 Subject: [PATCH] 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 --- pbx/pbx_realtime.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c index b0e294bc5e..9c807f8db5 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"); -- 2.47.2