From e77fba4b251dec3e56abc2f1e16ab28ace58d5bf Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Mon, 16 Sep 2013 18:36:22 +0000 Subject: [PATCH] Fix module load errors for test_ari_model.so. You cannot use a function pointer variable with an external function from another dynamically loaded module because data variables are always resolved even with RTLD_LAZY. * Added wrapper functions for ast_ari_validate_int() and ast_ari_validate_string() to use instead for the function pointer variable. (closes issue ASTERISK-22457) Reported by: David M. Lee ........ Merged revisions 399207 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@399208 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- tests/test_ari_model.c | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/tests/test_ari_model.c b/tests/test_ari_model.c index 1e293d791d..12c9a1e99e 100644 --- a/tests/test_ari_model.c +++ b/tests/test_ari_model.c @@ -38,6 +38,32 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/test.h" #include "../res/ari/ari_model_validators.h" +#if defined(TEST_FRAMEWORK) +/*! + * Wrapper of ast_test_validate_int() so an external function pointer is not used. + * + * \note Must do this because using an external function pointer + * does not play nicely when loading with RTLD_LAZY. + */ +static int wrap_ast_ari_validate_int(struct ast_json *json) +{ + return ast_ari_validate_int(json); +} +#endif /* defined(TEST_FRAMEWORK) */ + +#if defined(TEST_FRAMEWORK) +/*! + * Wrapper of ast_ari_validate_string() so an external function pointer is not used. + * + * \note Must do this because using an external function pointer + * does not play nicely when loading with RTLD_LAZY. + */ +static int wrap_ast_ari_validate_string(struct ast_json *json) +{ + return ast_ari_validate_string(json); +} +#endif /* defined(TEST_FRAMEWORK) */ + AST_TEST_DEFINE(validate_byte) { RAII_VAR(struct ast_json *, uut, NULL, ast_json_unref); @@ -385,21 +411,21 @@ AST_TEST_DEFINE(validate_list) uut = ast_json_array_create(); ast_test_validate(test, NULL != uut); - ast_test_validate(test, ast_ari_validate_list(uut, ast_ari_validate_string)); - ast_test_validate(test, ast_ari_validate_list(uut, ast_ari_validate_int)); + ast_test_validate(test, ast_ari_validate_list(uut, wrap_ast_ari_validate_string)); + ast_test_validate(test, ast_ari_validate_list(uut, wrap_ast_ari_validate_int)); res = ast_json_array_append(uut, ast_json_string_create("")); ast_test_validate(test, 0 == res); - ast_test_validate(test, ast_ari_validate_list(uut, ast_ari_validate_string)); - ast_test_validate(test, !ast_ari_validate_list(uut, ast_ari_validate_int)); + ast_test_validate(test, ast_ari_validate_list(uut, wrap_ast_ari_validate_string)); + ast_test_validate(test, !ast_ari_validate_list(uut, wrap_ast_ari_validate_int)); res = ast_json_array_append(uut, ast_json_integer_create(0)); ast_test_validate(test, 0 == res); - ast_test_validate(test, !ast_ari_validate_list(uut, ast_ari_validate_string)); - ast_test_validate(test, !ast_ari_validate_list(uut, ast_ari_validate_int)); + ast_test_validate(test, !ast_ari_validate_list(uut, wrap_ast_ari_validate_string)); + ast_test_validate(test, !ast_ari_validate_list(uut, wrap_ast_ari_validate_int)); ast_test_validate(test, - !ast_ari_validate_list(ast_json_null(), ast_ari_validate_string)); + !ast_ari_validate_list(ast_json_null(), wrap_ast_ari_validate_string)); return AST_TEST_PASS; }