From c6c3a63696d3bae1bb04099f900dc12e8f552026 Mon Sep 17 00:00:00 2001 From: Richard Mudgett <rmudgett@digium.com> Date: Thu, 4 Oct 2018 13:13:24 -0500 Subject: [PATCH] func_periodic_hook.c: Cleanup module resources on failure. * Make load_module() cleanup if it failed to setup the module. * Make unload_module() always return 0. It is silly to fail unloading if the hook function we try to unregister was not even registered. Change-Id: I280fc6e8ba2a7ee2588ca01d870eebaf74b4ffe6 --- funcs/func_periodic_hook.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/funcs/func_periodic_hook.c b/funcs/func_periodic_hook.c index 1f66747c36..31c534cb95 100644 --- a/funcs/func_periodic_hook.c +++ b/funcs/func_periodic_hook.c @@ -446,7 +446,8 @@ static int unload_module(void) { ast_context_destroy(NULL, AST_MODULE); - return ast_custom_function_unregister(&hook_function); + ast_custom_function_unregister(&hook_function); + return 0; } static int load_module(void) @@ -461,32 +462,36 @@ static int load_module(void) /* * Based on a handy recipe from the Asterisk Cookbook. */ - ast_add_extension(context_name, 1, exten_name, 1, "", "", + res = ast_add_extension(context_name, 1, exten_name, 1, "", "", "Set", "EncodedChannel=${CUT(HOOK_CHANNEL,-,1-2)}", NULL, AST_MODULE); - ast_add_extension(context_name, 1, exten_name, 2, "", "", + res |= ast_add_extension(context_name, 1, exten_name, 2, "", "", "Set", "GROUP_NAME=${EncodedChannel}${HOOK_ID}", NULL, AST_MODULE); - ast_add_extension(context_name, 1, exten_name, 3, "", "", + res |= ast_add_extension(context_name, 1, exten_name, 3, "", "", "Set", "GROUP(periodic-hook)=${GROUP_NAME}", NULL, AST_MODULE); - ast_add_extension(context_name, 1, exten_name, 4, "", "", "ExecIf", + res |= ast_add_extension(context_name, 1, exten_name, 4, "", "", "ExecIf", "$[${GROUP_COUNT(${GROUP_NAME}@periodic-hook)} > 1]?Hangup()", NULL, AST_MODULE); - ast_add_extension(context_name, 1, exten_name, 5, "", "", + res |= ast_add_extension(context_name, 1, exten_name, 5, "", "", "Set", "ChannelToSpy=${URIDECODE(${EncodedChannel})}", NULL, AST_MODULE); - ast_add_extension(context_name, 1, exten_name, 6, "", "", + res |= ast_add_extension(context_name, 1, exten_name, 6, "", "", "ChanSpy", "${ChannelToSpy},qEB", NULL, AST_MODULE); - res = ast_add_extension(context_name, 1, beep_exten, 1, "", "", + res |= ast_add_extension(context_name, 1, beep_exten, 1, "", "", "Answer", "", NULL, AST_MODULE); res |= ast_add_extension(context_name, 1, beep_exten, 2, "", "", "Playback", "beep", NULL, AST_MODULE); - res = ast_custom_function_register_escalating(&hook_function, AST_CFE_BOTH); + res |= ast_custom_function_register_escalating(&hook_function, AST_CFE_BOTH); - return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS; + if (res) { + unload_module(); + return AST_MODULE_LOAD_DECLINE; + } + return AST_MODULE_LOAD_SUCCESS; } int AST_OPTIONAL_API_NAME(ast_beep_start)(struct ast_channel *chan, -- GitLab