]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 373910 via svnmerge from
authorAutomerge script <automerge@asterisk.org>
Thu, 27 Sep 2012 17:25:34 +0000 (17:25 +0000)
committerAutomerge script <automerge@asterisk.org>
Thu, 27 Sep 2012 17:25:34 +0000 (17:25 +0000)
file:///srv/subversion/repos/asterisk/branches/10

................
  r373910 | file | 2012-09-27 11:50:46 -0500 (Thu, 27 Sep 2012) | 24 lines

  loader: Ensure dependent modules are properly initialized.

  If an Asterisk module specifies a dependency in ast_module_info.nonoptreq, it
  is possible for Asterisk to skip calling the modules's .load function.
  Asterisk was loading and linking the module via load_dynamic_module() but was
  not adding the module to the resource_heap. Therefore the module was not
  initialized based on it's priority along with the other modules in the heap.

  Now use load_resource() instead of load_dynamic_module() for non-optional
  requirement. This will add the module to the resource_heap so the module can
  be properly initialized in the correct order.

  This is required if there are any module global data structures initialized in
  the .load() callback for the module on platforms which do not support weak
  references.

  (issue ASTERISK-20439)
  Reported by: sruffell
  Patches:
       0001-loader-Ensure-dependent-modules-are-properly-initial.patch uploaded by sruffell (license 5417)
  ........

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

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

main/loader.c

index d0dd8e145d006f80b1b8dfe048ea5665d54f9e3b..0f8636bb9346567231974598c8961958adaa13d0 100644 (file)
@@ -371,7 +371,9 @@ static void unload_dynamic_module(struct ast_module *mod)
                while (!dlclose(lib));
 }
 
-static struct ast_module *load_dynamic_module(const char *resource_in, unsigned int global_symbols_only)
+static enum ast_module_load_result load_resource(const char *resource_name, unsigned int global_symbols_only, struct ast_heap *resource_heap, int required);
+
+static struct ast_module *load_dynamic_module(const char *resource_in, unsigned int global_symbols_only, struct ast_heap *resource_heap)
 {
        char fn[PATH_MAX] = "";
        void *lib = NULL;
@@ -440,11 +442,12 @@ static struct ast_module *load_dynamic_module(const char *resource_in, unsigned
                /* Force any required dependencies to load */
                char *each, *required_resource = ast_strdupa(mod->info->nonoptreq);
                while ((each = strsep(&required_resource, ","))) {
+                       struct ast_module *dependency;
                        each = ast_strip(each);
-
+                       dependency = find_resource(each, 0);
                        /* Is it already loaded? */
-                       if (!find_resource(each, 0)) {
-                               load_dynamic_module(each, global_symbols_only);
+                       if (!dependency) {
+                               load_resource(each, global_symbols_only, resource_heap, 1);
                        }
                }
        }
@@ -802,6 +805,10 @@ static enum ast_module_load_result start_resource(struct ast_module *mod)
        char tmp[256];
        enum ast_module_load_result res;
 
+       if (mod->flags.running) {
+               return AST_MODULE_LOAD_SUCCESS;
+       }
+
        if (!mod->info->load) {
                return AST_MODULE_LOAD_FAILURE;
        }
@@ -857,7 +864,7 @@ static enum ast_module_load_result load_resource(const char *resource_name, unsi
                        return AST_MODULE_LOAD_SKIP;
        } else {
 #ifdef LOADABLE_MODULES
-               if (!(mod = load_dynamic_module(resource_name, global_symbols_only))) {
+               if (!(mod = load_dynamic_module(resource_name, global_symbols_only, resource_heap))) {
                        /* don't generate a warning message during load_modules() */
                        if (!global_symbols_only) {
                                ast_log(LOG_WARNING, "Module '%s' could not be loaded.\n", resource_name);