mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Fix load errors related to the new ari_model_validators.
The Asterisk strategy of loading modules with RTLD_LAZY to extract metadata
from the module works well enough, until you try to take the address of a
function.
If a module takes the address of a function, that function needs to be
resolved at load time. That kinda defeats RTLD_LAZY.
This patch adds some ari_validator_{id}_fn() wrapper functions for safely
getting the function pointer from a different module.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@393576 65c4cc65-6c06-0410-ace0-fbb531ad65f3
			
			
This commit is contained in:
		| @@ -112,6 +112,11 @@ int ari_validate_{{c_id}}(struct ast_json *json) | ||||
| {{/properties}} | ||||
| 	return res; | ||||
| } | ||||
|  | ||||
| ari_validator ari_validate_{{c_id}}_fn(void) | ||||
| { | ||||
| 	return ari_validate_{{c_id}}; | ||||
| } | ||||
| {{/models}} | ||||
| {{/api_declaration}} | ||||
| {{/apis}} | ||||
|   | ||||
| @@ -17,6 +17,17 @@ | ||||
| /*! \file | ||||
|  * | ||||
|  * \brief Generated file - Build validators for ARI model objects. | ||||
|  * | ||||
|  * In addition to the normal validation functions one would normally expect, | ||||
|  * each validator has a ari_validate_{id}_fn() companion function that returns | ||||
|  * the validator's function pointer. | ||||
|  * | ||||
|  * The reason for this seamingly useless indirection is the way function | ||||
|  * pointers interfere with module loading. Asterisk attempts to dlopen() each | ||||
|  * module using \c RTLD_LAZY in order to read some metadata from the module. | ||||
|  * Unfortunately, if you take the address of a function, the function has to be | ||||
|  * resolvable at load time, even if \c RTLD_LAZY is specified. By moving the | ||||
|  * function-address-taking into this module, we can once again be lazy. | ||||
|  */ | ||||
|  | ||||
|  /* | ||||
| @@ -124,6 +135,11 @@ int ari_validate_date(struct ast_json *json); | ||||
| int ari_validate_list(struct ast_json *json, int (*fn)(struct ast_json *)); | ||||
|  | ||||
| /*! @} */ | ||||
|  | ||||
| /*! | ||||
|  * \brief Function type for validator functions. Allows for  | ||||
|  */ | ||||
| typedef int (*ari_validator)(struct ast_json *json); | ||||
| {{#apis}} | ||||
| {{#api_declaration}} | ||||
| {{#models}} | ||||
| @@ -138,6 +154,13 @@ int ari_validate_list(struct ast_json *json, int (*fn)(struct ast_json *)); | ||||
|  * \returns False (zero) if invalid. | ||||
|  */ | ||||
| int ari_validate_{{c_id}}(struct ast_json *json); | ||||
|  | ||||
| /*! | ||||
|  * \brief Function pointer to ari_validate_{{c_id}}(). | ||||
|  * | ||||
|  * See \ref ari_model_validators.h for more details. | ||||
|  */ | ||||
| ari_validator ari_validate_{{c_id}}_fn(void); | ||||
| {{/models}} | ||||
| {{/api_declaration}} | ||||
| {{/apis}} | ||||
|   | ||||
| @@ -89,7 +89,7 @@ static void stasis_http_{{c_nickname}}_cb( | ||||
| {{#response_class}} | ||||
| {{#is_list}} | ||||
| 			is_valid = ari_validate_list(response->message, | ||||
| 				ari_validate_{{c_singular_name}}); | ||||
| 				ari_validate_{{c_singular_name}}_fn()); | ||||
| {{/is_list}} | ||||
| {{^is_list}} | ||||
| 			is_valid = ari_validate_{{c_name}}( | ||||
| @@ -125,7 +125,7 @@ static void stasis_http_{{c_nickname}}_ws_cb(struct ast_websocket *ws_session, | ||||
| {{> param_parsing}} | ||||
| #if defined(AST_DEVMODE) | ||||
| 	session = ari_websocket_session_create(ws_session, | ||||
| 		ari_validate_{{response_class.c_name}}); | ||||
| 		ari_validate_{{response_class.c_name}}_fn()); | ||||
| #else | ||||
| 	session = ari_websocket_session_create(ws_session, NULL); | ||||
| #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user