pbx_config: Only the first [globals] section is seen.
authorCorey Farrell <git@cfware.com>
Fri, 2 Nov 2018 11:38:19 +0000 (07:38 -0400)
committerCorey Farrell <git@cfware.com>
Thu, 8 Nov 2018 11:43:10 +0000 (06:43 -0500)
If multiple [globals] sections are used (for example via separate
included files), only the first one is processed.  This can result in
lost global variables when using a modular extensions.conf.

ASTERISK-28146 #close

Change-Id: Iaac810c0a7c4d9b1bf8989fcc041cdb910ef08a0

CHANGES
pbx/pbx_config.c

diff --git a/CHANGES b/CHANGES
index 7fd478b..569717b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -23,6 +23,12 @@ chan_sip
 --- Functionality changes from Asterisk 16.0.0 to Asterisk 16.1.0 ------------
 ------------------------------------------------------------------------------
 
+pbx_config
+------------------
+ * pbx_config will now find and process multiple 'globals' sections from
+   extensions.conf.  Variables are processed in the order they are found
+   and duplicate variables overwrite the previous value.
+
 res_pjsip
 ------------------
  * New options 'trust_connected_line' and 'send_connected_line' have been
index 9bb2796..f6af7bf 100644 (file)
@@ -1714,10 +1714,20 @@ static int pbx_load_config(const char *config_file)
 
        ast_copy_string(userscontext, ast_variable_retrieve(cfg, "general", "userscontext") ?: "default", sizeof(userscontext));
 
-       for (v = ast_variable_browse(cfg, "globals"); v; v = v->next) {
-               pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
-               pbx_builtin_setvar_helper(NULL, v->name, realvalue);
+       /* ast_variable_browse does not merge multiple [globals] sections */
+       for (cxt = ast_category_browse(cfg, NULL);
+            cxt;
+            cxt = ast_category_browse(cfg, cxt)) {
+               if (strcasecmp(cxt, "globals")) {
+                       continue;
+               }
+
+               for (v = ast_variable_browse(cfg, cxt); v; v = v->next) {
+                       pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
+                       pbx_builtin_setvar_helper(NULL, v->name, realvalue);
+               }
        }
+
        for (cxt = ast_category_browse(cfg, NULL);
             cxt;
             cxt = ast_category_browse(cfg, cxt)) {