diff options
author | zuul <zuul@gerrit.asterisk.org> | 2017-02-22 12:08:47 -0600 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2017-02-22 12:08:47 -0600 |
commit | 726e3945c3f673719a99c8e2a866ff27b967f70e (patch) | |
tree | d8dcac3bf7e2e65cda0ed8c0360e6a012209cdfc /pbx | |
parent | 89e0bf6dddd13e8b399e7739df4bcf864fe99d55 (diff) | |
parent | ca6d001144d56678f40ab2e625be143450dac693 (diff) |
Merge "pbx_realtime: Prevent premature extension matching" into 13
Diffstat (limited to 'pbx')
-rw-r--r-- | pbx/pbx_realtime.c | 10 |
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"); |