Fix module load errors for test_ari_model.so.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 16 Sep 2013 18:36:22 +0000 (18:36 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 16 Sep 2013 18:36:22 +0000 (18:36 +0000)
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

index 1e293d7..12c9a1e 100644 (file)
@@ -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;
 }