diff options
author | Corey Farrell <git@cfware.com> | 2015-06-08 11:09:22 -0400 |
---|---|---|
committer | Corey Farrell <git@cfware.com> | 2015-06-08 11:09:22 -0400 |
commit | 55c8daf88b94f74e334ab246c51bdb7b469eedc4 (patch) | |
tree | 8c79fa393e6f2427929d2f89bf0bd4ee03b25a09 /tests | |
parent | 720251f2b80639324a37b2041997292d97858d39 (diff) |
Fix unsafe uses of ast_context pointers.
Although ast_context_find, ast_context_find_or_create and
ast_context_destroy perform locking of the contexts table,
any context pointer can become invalid at any time that the
contexts table is unlocked. This change adds locking around
all complete operations involving these functions.
Places where ast_context_find was followed by ast_context_destroy
have been replaced with calls ast_context_destroy_by_name.
ASTERISK-25094 #close
Reported by: Corey Farrell
Change-Id: I1866b6787730c9c4f3f836b6133ffe9c820734fa
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_gosub.c | 10 | ||||
-rw-r--r-- | tests/test_pbx.c | 9 |
2 files changed, 7 insertions, 12 deletions
diff --git a/tests/test_gosub.c b/tests/test_gosub.c index 604d8e301..05a3550e0 100644 --- a/tests/test_gosub.c +++ b/tests/test_gosub.c @@ -42,10 +42,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") AST_TEST_DEFINE(test_gosub) { +#define CONTEXT_NAME "tests_test_gosub_virtual_context" int res = AST_TEST_PASS, i; struct ast_channel *chan; struct ast_str *str; - struct ast_context *con; struct testplan { const char *app; const char *args; @@ -119,14 +119,14 @@ AST_TEST_DEFINE(test_gosub) } /* Create our test dialplan */ - if (!(con = ast_context_find_or_create(NULL, NULL, "tests_test_gosub_virtual_context", "test_gosub"))) { + if (!ast_context_find_or_create(NULL, NULL, CONTEXT_NAME, "test_gosub")) { ast_test_status_update(test, "Unable to create test dialplan context"); ast_free(str); ast_channel_unref(chan); return AST_TEST_FAIL; } - ast_add_extension2(con, 1, "s", 1, NULL, NULL, "NoOp", ast_strdup(""), ast_free_ptr, "test_gosub"); + ast_add_extension(CONTEXT_NAME, 1, "s", 1, NULL, NULL, "NoOp", ast_strdup(""), ast_free_ptr, "test_gosub"); for (i = 0; i < ARRAY_LEN(testplan); i++) { if (testplan[i].app == NULL) { @@ -157,8 +157,8 @@ AST_TEST_DEFINE(test_gosub) ast_free(str); ast_channel_unref(chan); - ast_context_remove_extension2(con, "s", 1, NULL, 0); - ast_context_destroy(con, "test_gosub"); + ast_context_remove_extension(CONTEXT_NAME, "s", 1, NULL); + ast_context_destroy(NULL, "test_gosub"); return res; } diff --git a/tests/test_pbx.c b/tests/test_pbx.c index 5e2e232ed..bb5d8e871 100644 --- a/tests/test_pbx.c +++ b/tests/test_pbx.c @@ -198,7 +198,6 @@ AST_TEST_DEFINE(pattern_match_test) */ struct { const char * context_string; - struct ast_context *context; } contexts[] = { { TEST_PATTERN, }, { TEST_PATTERN_INCLUDE, }, @@ -267,7 +266,7 @@ AST_TEST_DEFINE(pattern_match_test) */ for (i = 0; i < ARRAY_LEN(contexts); ++i) { - if (!(contexts[i].context = ast_context_find_or_create(NULL, NULL, contexts[i].context_string, registrar))) { + if (!ast_context_find_or_create(NULL, NULL, contexts[i].context_string, registrar)) { ast_test_status_update(test, "Failed to create context %s\n", contexts[i].context_string); res = AST_TEST_FAIL; goto cleanup; @@ -319,11 +318,7 @@ AST_TEST_DEFINE(pattern_match_test) } cleanup: - for (i = 0; i < ARRAY_LEN(contexts); ++i) { - if (contexts[i].context) { - ast_context_destroy(contexts[i].context, registrar); - } - } + ast_context_destroy(NULL, registrar); return res; } |