[Asterisk-code-review] pbx realtime: Prevent premature extension matching (asterisk[13])

Sean Bright asteriskteam at digium.com
Tue Feb 21 13:05:58 CST 2017


Sean Bright has uploaded a new change for review. ( https://gerrit.asterisk.org/5049 )

Change subject: pbx_realtime: Prevent premature extension matching
......................................................................

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 correctly match even
though it may not be 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 a sub-optimal match,
but this patch should improve the overall behavior.

ASTERISK-18271 #close
Reported by: Charlie Smurthwaite

Change-Id: I56d9ac15810eb1775966b669c3028e32cc7bd809
---
M pbx/pbx_realtime.c
1 file changed, 10 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/49/5049/1

diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c
index 1d58007..2b17cbc 100644
--- a/pbx/pbx_realtime.c
+++ b/pbx/pbx_realtime.c
@@ -143,6 +143,13 @@
 	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 @@
 		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");
 

-- 
To view, visit https://gerrit.asterisk.org/5049
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I56d9ac15810eb1775966b669c3028e32cc7bd809
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Owner: Sean Bright <sean.bright at gmail.com>



More information about the asterisk-code-review mailing list