]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
pbx: Handle a completely empty dialplan during a context merge
authorMatthew Jordan <mjordan@digium.com>
Sun, 16 Feb 2014 03:15:49 +0000 (03:15 +0000)
committerMatthew Jordan <mjordan@digium.com>
Sun, 16 Feb 2014 03:15:49 +0000 (03:15 +0000)
It is highly unlikely, but - at least in Asterisk 12 - theoretically possible
to load Asterisk with no dialplan whatsoever. If that occurs, and some other
module (that is not a pbx module) attempts to merge its contexts into the
dialplan, the existing merge routine will crash. This is because it is not
insane, and rightly believes that you provided some sort of dialplan,
somewhere.

This patch will gracefully merge the contexts in such a case. Note that this
is highly unlikely to occur in 1.8/11, as features will most likely provide
some dialplan via parking. However, in Asterisk 12, parking is now provided
by res_parking, and hence may create its dialplan later.

(closes issue ASTERISK-23297)
Reported by: CJ Oster

Review: https://reviewboard.asterisk.org/r/3222
........

Merged revisions 408200 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@408201 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/pbx.c

index b65268f5f8389289ba4f3a7fc2df5c6678db067e..a3195e0494cada1b09505d661f54394589f7e0d5 100644 (file)
@@ -8924,6 +8924,16 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_
        begintime = ast_tvnow();
        ast_mutex_lock(&context_merge_lock);/* Serialize ast_merge_contexts_and_delete */
        ast_wrlock_contexts();
+
+       if (!contexts_table) {
+               /* Well, that's odd. There are no contexts. */
+               contexts_table = exttable;
+               contexts = *extcontexts;
+               ast_unlock_contexts();
+               ast_mutex_unlock(&context_merge_lock);
+               return;
+       }
+
        iter = ast_hashtab_start_traversal(contexts_table);
        while ((tmp = ast_hashtab_next(iter))) {
                context_merge(extcontexts, exttable, tmp, registrar);