From d7fc85e69d5dc23f27ec15dacaa03914ece64e42 Mon Sep 17 00:00:00 2001 From: Corey Farrell <git@cfware.com> Date: Thu, 26 Mar 2015 17:47:42 +0000 Subject: [PATCH] res_pjsip: Enable unload of all modules at shutdown. * Move most of res_pjsip:module_unload to unload_pjsip to resolve crashes caused by running PJSIP functions from non-PJSIP threads. * Remove call to pjsip_endpt_destroy(ast_pjsip_endpoint), it was causing crashes in some cases. In theory pj_shutdown() should take care of this. * Mark res_pjsip_keepalive and res_pjsip_session as allowed to unload at shutdown. * Resolve leaked config global in res_pjsip_notify. * Unregister pubsub pjsip service module. * Implement cleanup for res_pjsip_session. ASTERISK-24731 #close Reported by: Corey Farrell Review: https://reviewboard.asterisk.org/r/4498/ ........ Merged revisions 433469 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@433470 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_pjsip.c | 25 +++++++++++-------------- res/res_pjsip_keepalive.c | 2 +- res/res_pjsip_notify.c | 1 + res/res_pjsip_pubsub.c | 1 + res/res_pjsip_session.c | 8 ++++++-- 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/res/res_pjsip.c b/res/res_pjsip.c index aa6a500cdc..e5af28ca82 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -3520,14 +3520,21 @@ static int reload_module(void) static int unload_pjsip(void *data) { ast_cli_unregister_multiple(cli_commands, ARRAY_LEN(cli_commands)); + ast_res_pjsip_cleanup_options_handling(); + internal_sip_destroy_outbound_authentication(); + ast_sip_destroy_distributor(); + ast_res_pjsip_destroy_configuration(); + ast_sip_destroy_system(); + ast_sip_destroy_global_headers(); + internal_sip_unregister_service(&supplement_module); + if (monitor_thread) { + stop_monitor_thread(); + } if (memory_pool) { pj_pool_release(memory_pool); memory_pool = NULL; } - if (ast_pjsip_endpoint) { - pjsip_endpt_destroy(ast_pjsip_endpoint); - ast_pjsip_endpoint = NULL; - } + ast_pjsip_endpoint = NULL; pj_caching_pool_destroy(&caching_pool); pj_shutdown(); return 0; @@ -3535,16 +3542,6 @@ static int unload_pjsip(void *data) static int unload_module(void) { - ast_res_pjsip_cleanup_options_handling(); - internal_sip_destroy_outbound_authentication(); - ast_sip_destroy_distributor(); - ast_res_pjsip_destroy_configuration(); - ast_sip_destroy_system(); - ast_sip_destroy_global_headers(); - internal_sip_unregister_service(&supplement_module); - if (monitor_thread) { - stop_monitor_thread(); - } /* The thread this is called from cannot call PJSIP/PJLIB functions, * so we have to push the work to the threadpool to handle */ diff --git a/res/res_pjsip_keepalive.c b/res/res_pjsip_keepalive.c index 5e9d168eac..b854fc957e 100644 --- a/res/res_pjsip_keepalive.c +++ b/res/res_pjsip_keepalive.c @@ -244,7 +244,7 @@ static int load_module(void) ast_sorcery_observer_add(ast_sip_get_sorcery(), "global", &keepalive_global_observer); ast_sorcery_reload_object(ast_sip_get_sorcery(), "global"); - ast_module_ref(ast_module_info->self); + ast_module_shutdown_ref(ast_module_info->self); return AST_MODULE_LOAD_SUCCESS; } diff --git a/res/res_pjsip_notify.c b/res/res_pjsip_notify.c index d7e3d803b7..e494daf26f 100644 --- a/res/res_pjsip_notify.c +++ b/res/res_pjsip_notify.c @@ -1021,6 +1021,7 @@ static int unload_module(void) ast_manager_unregister("PJSIPNotify"); ast_cli_unregister_multiple(cli_options, ARRAY_LEN(cli_options)); aco_info_destroy(¬ify_cfg); + ao2_global_obj_release(globals); return 0; } diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c index 4d53091b9b..e7b4b02ec6 100644 --- a/res/res_pjsip_pubsub.c +++ b/res/res_pjsip_pubsub.c @@ -4286,6 +4286,7 @@ static int unload_module(void) ast_manager_unregister(AMI_SHOW_SUBSCRIPTIONS_INBOUND); ast_manager_unregister("PJSIPShowResourceLists"); + ast_sip_unregister_service(&pubsub_module); if (sched) { ast_sched_context_destroy(sched); } diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index 865483a093..4854c51d03 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -2641,14 +2641,18 @@ static int load_module(void) } ast_sip_register_service(&session_reinvite_module); - ast_module_ref(ast_module_info->self); + ast_module_shutdown_ref(ast_module_info->self); return AST_MODULE_LOAD_SUCCESS; } static int unload_module(void) { - /* This will never get called as this module can't be unloaded */ + ast_sip_unregister_service(&session_reinvite_module); + ast_sip_unregister_service(&session_module); + ast_sorcery_delete(ast_sip_get_sorcery(), nat_hook); + ao2_cleanup(nat_hook); + ao2_cleanup(sdp_handlers); return 0; } -- GitLab