From: Corey Farrell Date: Thu, 2 Nov 2017 00:46:11 +0000 (-0400) Subject: Prevent unload of modules which implement an Optional API. X-Git-Tag: 13.19.0-rc1~167^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=73a5e9f0e9600bb656c31c9a091371b495b1fb03;p=thirdparty%2Fasterisk.git Prevent unload of modules which implement an Optional API. Once an Optional API module is loaded it should stay loaded. Unloading an optional API module runs the risk of a crash if something else is using it. This patch causes all optional API providers to tell the module loader not to unload except at shutdown. ASTERISK-27389 Change-Id: Ia07786fe655681aec49cc8d3d96e06483b11f5e6 --- diff --git a/funcs/func_periodic_hook.c b/funcs/func_periodic_hook.c index f459e35768..0e260c9cad 100644 --- a/funcs/func_periodic_hook.c +++ b/funcs/func_periodic_hook.c @@ -490,6 +490,11 @@ static int load_module(void) res = ast_custom_function_register_escalating(&hook_function, AST_CFE_BOTH); + if (!res) { + /* For Optional API. */ + ast_module_shutdown_ref(ast_module_info->self); + } + return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS; } diff --git a/res/res_agi.c b/res/res_agi.c index d7ea3510c2..d104c43629 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -4715,6 +4715,10 @@ static int load_module(void) unload_module(); return AST_MODULE_LOAD_DECLINE; } + + /* For Optional API. */ + ast_module_shutdown_ref(ast_module_info->self); + return AST_MODULE_LOAD_SUCCESS; } diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c index f49a3573e5..2baccc0527 100644 --- a/res/res_http_websocket.c +++ b/res/res_http_websocket.c @@ -1439,6 +1439,9 @@ static int load_module(void) ast_http_uri_link(&websocketuri); websocket_add_protocol_internal("echo", websocket_echo_callback); + /* For Optional API. */ + ast_module_shutdown_ref(ast_module_info->self); + return 0; } diff --git a/res/res_monitor.c b/res/res_monitor.c index c4ee674f91..b7ef2ea888 100644 --- a/res/res_monitor.c +++ b/res/res_monitor.c @@ -987,6 +987,9 @@ static int load_module(void) ast_manager_register_xml("PauseMonitor", EVENT_FLAG_CALL, pause_monitor_action); ast_manager_register_xml("UnpauseMonitor", EVENT_FLAG_CALL, unpause_monitor_action); + /* For Optional API. */ + ast_module_shutdown_ref(ast_module_info->self); + return AST_MODULE_LOAD_SUCCESS; } diff --git a/res/res_pktccops.c b/res/res_pktccops.c index 837e0f5e19..037e533d3c 100644 --- a/res/res_pktccops.c +++ b/res/res_pktccops.c @@ -1474,6 +1474,10 @@ static int load_module(void) } ast_cli_register_multiple(cli_pktccops, sizeof(cli_pktccops) / sizeof(struct ast_cli_entry)); restart_pktc_thread(); + + /* For Optional API. */ + ast_module_shutdown_ref(ast_module_info->self); + return 0; } diff --git a/res/res_smdi.c b/res/res_smdi.c index 9a40227f2d..7b4c42b176 100644 --- a/res/res_smdi.c +++ b/res/res_smdi.c @@ -1407,6 +1407,10 @@ static int _unload_module(int fromload) } smdi_loaded = 0; + + /* For Optional API. */ + ast_module_shutdown_ref(ast_module_info->self); + return 0; } diff --git a/res/res_statsd.c b/res/res_statsd.c index eb0dc67029..b8e4d04758 100644 --- a/res/res_statsd.c +++ b/res/res_statsd.c @@ -355,6 +355,9 @@ static int load_module(void) return AST_MODULE_LOAD_DECLINE; } + /* For Optional API. */ + ast_module_shutdown_ref(ast_module_info->self); + return AST_MODULE_LOAD_SUCCESS; }