]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
pbx_config.c: Don't crash when unloading module.
authorSean Bright <sean@seanbright.com>
Sat, 2 Dec 2023 16:13:31 +0000 (11:13 -0500)
committerSean Bright <sean@seanbright.com>
Wed, 6 Dec 2023 21:24:47 +0000 (21:24 +0000)
`pbx_config` subscribes to manager events to capture the `FullyBooted`
event but fails to unsubscribe if the module is loaded after that
event fires. If the module is unloaded, a crash occurs the next time a
manager event is raised.

We now unsubscribe when the module is unloaded if we haven't already
unsubscribed.

Fixes #470

pbx/pbx_config.c

index f39dde54dbc01b590e8e8823bd455c188a3ea37b..cb1c45a8c345f9ddce0d3cc82e5484c40cd34981 100644 (file)
@@ -104,6 +104,8 @@ static int clearglobalvars_config = 0;
 static int extenpatternmatchnew_config = 0;
 static char *overrideswitch_config = NULL;
 
+static struct stasis_subscription *fully_booted_subscription;
+
 AST_MUTEX_DEFINE_STATIC(save_dialplan_lock);
 
 AST_MUTEX_DEFINE_STATIC(reload_lock);
@@ -1633,6 +1635,8 @@ static int unload_module(void)
        ast_manager_unregister(AMI_EXTENSION_REMOVE);
        ast_context_destroy(NULL, registrar);
 
+       stasis_unsubscribe_and_join(fully_booted_subscription);
+
        return 0;
 }
 
@@ -1992,7 +1996,7 @@ static void startup_event_cb(void *data, struct stasis_subscription *sub, struct
 
        ast_log(LOG_WARNING, "users.conf is deprecated and will be removed in a future version of Asterisk\n");
 
-       stasis_unsubscribe(sub);
+       fully_booted_subscription = stasis_unsubscribe(fully_booted_subscription);
 }
 
 static void pbx_load_users(void)
@@ -2016,7 +2020,8 @@ static void pbx_load_users(void)
                return;
 
        /*! \todo Remove users.conf support in Asterisk 23 */
-       stasis_subscribe_pool(ast_manager_get_topic(), startup_event_cb, NULL);
+       fully_booted_subscription =
+               stasis_subscribe_pool(ast_manager_get_topic(), startup_event_cb, NULL);
 
        for (cat = ast_category_browse(cfg, NULL); cat ; cat = ast_category_browse(cfg, cat)) {
                if (!strcasecmp(cat, "general"))