]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
pbx_realtime: Prevent premature extension matching 60/5060/1
authorSean Bright <sean.bright@gmail.com>
Tue, 21 Feb 2017 16:47:41 +0000 (11:47 -0500)
committerSean Bright <sean.bright@gmail.com>
Wed, 22 Feb 2017 16:22:46 +0000 (10:22 -0600)
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

index b0e294bc5e895a43e3af926107385cf3ca007303..9c807f8db54154b40b25ceef27a143cbcf878c31 100644 (file)
@@ -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");