From 1920639eab0572d875a07b0c1caaf7fb22fe9ba7 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Sat, 2 Dec 2023 11:13:31 -0500 Subject: [PATCH] pbx_config.c: Don't crash when unloading module. `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 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pbx/pbx_config.c b/pbx/pbx_config.c index f39dde54db..cb1c45a8c3 100644 --- a/pbx/pbx_config.c +++ b/pbx/pbx_config.c @@ -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"))