]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix potential crash after unload of func_periodic_hook or test_message. 68/468/2
authorCorey Farrell <git@cfware.com>
Thu, 14 May 2015 05:06:53 +0000 (01:06 -0400)
committerCorey Farrell <git@cfware.com>
Thu, 14 May 2015 10:41:30 +0000 (05:41 -0500)
These modules save a pointer to the context they create on load, and
use that pointer to destroy the context at unload.  It is not safe
to save this pointer, it is replaced during load of pbx_config,
pbx_lua or pbx_ael.

This change causes the modules to pass NULL to ast_context_destroy,
a safer way to perform the unregistration since it does not use
a pointer that could become invalid.

ASTERISK-25085 #close
Reported by: Corey Farrell

Change-Id: I6a00ec8e38046058f97dc703e1adcde9bf517835

funcs/func_periodic_hook.c
tests/test_message.c

index 6ddab5600dd0d418a21104fdf580387073fe8b62..bb0ee0db7de3245e897083af4bb51cbf3856c253 100644 (file)
@@ -446,13 +446,9 @@ static struct ast_custom_function hook_function = {
        .write = hook_write,
 };
 
-static struct ast_context *func_periodic_hook_context;
-
 static int unload_module(void)
 {
-       if (func_periodic_hook_context) {
-               ast_context_destroy(func_periodic_hook_context, AST_MODULE);
-       }
+       ast_context_destroy(NULL, AST_MODULE);
 
        return ast_custom_function_unregister(&hook_function);
 }
@@ -461,9 +457,7 @@ static int load_module(void)
 {
        int res;
 
-       func_periodic_hook_context = ast_context_find_or_create(NULL, NULL,
-                       context_name, AST_MODULE);
-       if (!func_periodic_hook_context) {
+       if (!ast_context_find_or_create(NULL, NULL, context_name, AST_MODULE)) {
                ast_log(LOG_ERROR, "Failed to create %s dialplan context.\n", context_name);
                return AST_MODULE_LOAD_DECLINE;
        }
index 26cd90a4ddf4749d0d2f951483a9830b608a30f5..2c9334ad9c463d7a3ecf495e7d72d73dc6e3cc12 100644 (file)
@@ -51,8 +51,6 @@ ASTERISK_REGISTER_FILE()
 /*! \brief The number of user events we should get in a dialplan test */
 #define DEFAULT_EXPECTED_EVENTS 4
 
-static struct ast_context *test_message_context;
-
 /*! \brief The current number of received user events */
 static int received_user_events;
 
@@ -822,9 +820,7 @@ static int unload_module(void)
        AST_TEST_UNREGISTER(test_message_has_destination_handler);
        AST_TEST_UNREGISTER(test_message_msg_send);
 
-       if (test_message_context) {
-               ast_context_destroy(test_message_context, AST_MODULE);
-       }
+       ast_context_destroy(NULL, AST_MODULE);
 
        ast_manager_unregister_hook(&user_event_hook);
 
@@ -835,8 +831,7 @@ static int create_test_dialplan(void)
 {
        int res = 0;
 
-       test_message_context = ast_context_find_or_create(NULL, NULL, TEST_CONTEXT, AST_MODULE);
-       if (!test_message_context) {
+       if (!ast_context_find_or_create(NULL, NULL, TEST_CONTEXT, AST_MODULE)) {
                return -1;
        }