]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Unregister SIP provider API if module load is declined
authorMatthew Jordan <mjordan@digium.com>
Wed, 30 Jan 2013 15:07:59 +0000 (15:07 +0000)
committerMatthew Jordan <mjordan@digium.com>
Wed, 30 Jan 2013 15:07:59 +0000 (15:07 +0000)
A user in #asterisk ran into a problem where a configuration error prevented
the chan_sip module from being loaded. Upon fixing their configuratione error,
they could no longer load the chan_sip module. This was because the
configuration checking happened after the SIP provider was registered with the
Asterisk core, and subsequent attempts to load the SIP module failed as the
provider was already registered.

Since we want to detect any failure in registering chan_sip as early as
possible (as that could be emblematic of a deeper mismatch between module
and Asterisk core), this patch does not change the registration location, but
does ensure that if a module load is declined, we unregister the module as
the SIP api provider.

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

channels/chan_sip.c

index 1c7d2fa3af10fab6f4920224cf54d763e224f406..30a4eaca97f88ab86b6b064dd95a3720b5bce6db 100644 (file)
@@ -34166,7 +34166,6 @@ static int load_module(void)
 
        if (!(io = io_context_create())) {
                ast_log(LOG_ERROR, "Unable to create I/O context\n");
-               ast_sched_context_destroy(sched);
                return AST_MODULE_LOAD_FAILURE;
        }
 
@@ -34174,6 +34173,7 @@ static int load_module(void)
 
        can_parse_xml = sip_is_xml_parsable();
        if (reload_config(sip_reloadreason)) {  /* Load the configuration from sip.conf */
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }
 
@@ -34244,11 +34244,13 @@ static int load_module(void)
        initialize_escs();
 
        if (sip_epa_register(&cc_epa_static_data)) {
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }
 
        if (sip_reqresp_parser_init() == -1) {
                ast_log(LOG_ERROR, "Unable to initialize the SIP request and response parser\n");
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }
 
@@ -34257,13 +34259,16 @@ static int load_module(void)
                 * in incoming PUBLISH requests
                 */
                if (ast_cc_agent_register(&sip_cc_agent_callbacks)) {
+                       ast_sip_api_provider_unregister();
                        return AST_MODULE_LOAD_DECLINE;
                }
        }
        if (ast_cc_monitor_register(&sip_cc_monitor_callbacks)) {
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }
        if (!(sip_monitor_instances = ao2_container_alloc(37, sip_monitor_instance_hash_fn, sip_monitor_instance_cmp_fn))) {
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }