From: Arran Cudbard-Bell Date: Thu, 2 Jun 2022 18:14:16 +0000 (-0400) Subject: Move libcurl init to global_lib framework X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6984c06e3a810a7a5aa952f897bbe50f80265a1d;p=thirdparty%2Ffreeradius-server.git Move libcurl init to global_lib framework --- diff --git a/src/lib/curl/base.c b/src/lib/curl/base.c index 417d0af5e3a..2f6d02267e3 100644 --- a/src/lib/curl/base.c +++ b/src/lib/curl/base.c @@ -30,8 +30,6 @@ #include "attrs.h" -static uint32_t instance_count = 0; - fr_dict_attr_t const *attr_tls_certificate; static fr_dict_t const *dict_freeradius; /*internal dictionary for server*/ @@ -74,72 +72,6 @@ CONF_PARSER fr_curl_tls_config[] = { CONF_PARSER_TERMINATOR }; -/** Initialise global curl options - * - * libcurl is meant to performa reference counting, but still seems to - * leak lots of memory if we call curl_global_init many times. - */ -int fr_curl_init(void) -{ - CURLcode ret; - curl_version_info_data *curlversion; - - if (instance_count > 0) { - instance_count++; - return 0; - } - -#ifdef WITH_TLS - /* - * Use our OpenSSL init with the hope that - * the free function will also free the - * memory allocated during SSL init. - */ - if (fr_openssl_init() < 0) return -1; -#endif - - if (fr_dict_autoload(curl_dict) < 0) { - PERROR("Failed loading dictionaries for curl"); - return -1; - } - - if (fr_dict_attr_autoload(curl_attr) < 0) { - PERROR("Failed loading dictionaries for curl"); - return -1; - } - - ret = curl_global_init(CURL_GLOBAL_ALL); - if (ret != CURLE_OK) { - ERROR("CURL init returned error: %i - %s", ret, curl_easy_strerror(ret)); - fr_dict_autofree(curl_dict); - return -1; - } - - curlversion = curl_version_info(CURLVERSION_NOW); - if (strcmp(LIBCURL_VERSION, curlversion->version) != 0) { - WARN("libcurl version changed since the server was built"); - WARN("linked: %s built: %s", curlversion->version, LIBCURL_VERSION); - } - - INFO("libcurl version: %s", curl_version()); - - instance_count++; - - return 0; -} - -void fr_curl_free(void) -{ - if (--instance_count > 0) return; - - fr_dict_autofree(curl_dict); - -#ifdef WITH_TLS - fr_openssl_free(); -#endif - curl_global_cleanup(); -} - int fr_curl_easy_tls_init(fr_curl_io_request_t *randle, fr_curl_tls_t const *conf) { request_t *request = randle->request; @@ -241,3 +173,70 @@ int fr_curl_response_certinfo(request_t *request, fr_curl_io_request_t *randle) } return 0; } + + +/** Initialise global curl options + * + * libcurl is meant to performa reference counting, but still seems to + * leak lots of memory if we call curl_global_init many times. + */ +static int fr_curl_init(void) +{ + CURLcode ret; + curl_version_info_data *curlversion; + +#ifdef WITH_TLS + /* + * Use our OpenSSL init with the hope that + * the free function will also free the + * memory allocated during SSL init. + */ + if (fr_openssl_init() < 0) return -1; +#endif + + if (fr_dict_autoload(curl_dict) < 0) { + PERROR("Failed loading dictionaries for curl"); + return -1; + } + + if (fr_dict_attr_autoload(curl_attr) < 0) { + PERROR("Failed loading dictionaries for curl"); + return -1; + } + + ret = curl_global_init(CURL_GLOBAL_ALL); + if (ret != CURLE_OK) { + ERROR("CURL init returned error: %i - %s", ret, curl_easy_strerror(ret)); + fr_dict_autofree(curl_dict); + return -1; + } + + curlversion = curl_version_info(CURLVERSION_NOW); + if (strcmp(LIBCURL_VERSION, curlversion->version) != 0) { + WARN("libcurl version changed since the server was built"); + WARN("linked: %s built: %s", curlversion->version, LIBCURL_VERSION); + } + + INFO("libcurl version: %s", curl_version()); + + return 0; +} + +static void fr_curl_free(void) +{ + fr_dict_autofree(curl_dict); + +#ifdef WITH_TLS + fr_openssl_free(); +#endif + curl_global_cleanup(); +} + +/* + * Public symbol modules can reference to auto instantiate libcurl + */ +global_lib_autoinst_t fr_curl_autoinst = { + .name = "curl", + .init = fr_curl_init, + .free = fr_curl_free +}; diff --git a/src/lib/curl/base.h b/src/lib/curl/base.h index 4f2b01f4470..788dbfa1c1c 100644 --- a/src/lib/curl/base.h +++ b/src/lib/curl/base.h @@ -32,9 +32,10 @@ extern "C" { #define CURL_NO_OLDIES 1 #include +#include +#include #include #include -#include DIAG_OFF(DIAG_UNKNOWN_PRAGMAS) DIAG_OFF(disabled-macro-expansion) @@ -116,7 +117,8 @@ typedef struct { bool extract_cert_attrs; } fr_curl_tls_t; -extern CONF_PARSER fr_curl_tls_config[]; +extern CONF_PARSER fr_curl_tls_config[]; +extern global_lib_autoinst_t fr_curl_autoinst; int fr_curl_io_request_enqueue(fr_curl_handle_t *mhandle, request_t *request, fr_curl_io_request_t *creq); @@ -125,10 +127,6 @@ fr_curl_io_request_t *fr_curl_io_request_alloc(TALLOC_CTX *ctx); fr_curl_handle_t *fr_curl_io_init(TALLOC_CTX *ctx, fr_event_list_t *el, bool multiplex); -int fr_curl_init(void); - -void fr_curl_free(void); - int fr_curl_response_certinfo(request_t *request, fr_curl_io_request_t *randle); int fr_curl_easy_tls_init (fr_curl_io_request_t *randle, fr_curl_tls_t const *conf); diff --git a/src/lib/server/module_rlm.c b/src/lib/server/module_rlm.c index 158325ecee2..ac73a926f0b 100644 --- a/src/lib/server/module_rlm.c +++ b/src/lib/server/module_rlm.c @@ -29,6 +29,7 @@ RCSID("$Id$") #include +#include #include #include #include diff --git a/src/lib/server/virtual_servers.c b/src/lib/server/virtual_servers.c index 54e9f42672e..5ae9ee979d6 100644 --- a/src/lib/server/virtual_servers.c +++ b/src/lib/server/virtual_servers.c @@ -27,15 +27,16 @@ RCSID("$Id$") +#include #include #include +#include #include +#include #include -#include -#include #include +#include #include -#include #include #include diff --git a/src/modules/rlm_imap/rlm_imap.c b/src/modules/rlm_imap/rlm_imap.c index e03958d2083..312662edf88 100644 --- a/src/modules/rlm_imap/rlm_imap.c +++ b/src/modules/rlm_imap/rlm_imap.c @@ -24,9 +24,10 @@ */ RCSID("$Id$") +#include #include +#include #include -#include static fr_dict_t const *dict_radius; /*dictionary for radius protocol*/ @@ -46,6 +47,12 @@ fr_dict_attr_autoload_t rlm_imap_dict_attr[] = { { NULL }, }; +extern global_lib_autoinst_t const * const rlm_imap_lib[]; +global_lib_autoinst_t const * const rlm_imap_lib[] = { + &fr_curl_autoinst, + GLOBAL_LIB_TERMINATOR +}; + typedef struct { char const *uri; //!< URI of imap server fr_time_delta_t timeout; //!< Timeout for connection and server response @@ -164,23 +171,6 @@ static unlang_action_t CC_HINT(nonnull(1,2)) mod_authenticate(rlm_rcode_t *p_res return unlang_module_yield(request, mod_authenticate_resume, NULL, randle); } -/* - * Initialize global curl instance - */ -static int mod_load(void) -{ - if (fr_curl_init() < 0) return -1; - return 0; -} - -/* - * Close global curl instance - */ -static void mod_unload(void) -{ - fr_curl_free(); -} - /* * Initialize a new thread with a curl instance */ @@ -225,8 +215,6 @@ module_rlm_t rlm_imap = { .inst_size = sizeof(rlm_imap_t), .thread_inst_size = sizeof(rlm_imap_thread_t), .config = module_config, - .onload = mod_load, - .unload = mod_unload, .thread_instantiate = mod_thread_instantiate, .thread_detach = mod_thread_detach, }, diff --git a/src/modules/rlm_rest/rlm_rest.c b/src/modules/rlm_rest/rlm_rest.c index 13c38b38923..deee9f2919b 100644 --- a/src/modules/rlm_rest/rlm_rest.c +++ b/src/modules/rlm_rest/rlm_rest.c @@ -25,6 +25,7 @@ RCSID("$Id$") #include #include +#include #include #include #include @@ -173,6 +174,12 @@ fr_dict_attr_autoload_t rlm_rest_dict_attr[] = { { NULL } }; +extern global_lib_autoinst_t const * const rlm_rest_lib[]; +global_lib_autoinst_t const * const rlm_rest_lib[] = { + &fr_curl_autoinst, + GLOBAL_LIB_TERMINATOR +}; + /** Update the status attribute * * @param[in] request The current request. @@ -1208,8 +1215,6 @@ static int mod_load(void) /* developer sanity */ fr_assert((NUM_ELEMENTS(http_body_type_supported)) == REST_HTTP_BODY_NUM_ENTRIES); - if (fr_curl_init() < 0) return -1; - #ifdef HAVE_JSON fr_json_version_print(); #endif @@ -1217,15 +1222,6 @@ static int mod_load(void) return 0; } -/** Called to free resources held by libcurl - * - * @see mod_load - */ -static void mod_unload(void) -{ - fr_curl_free(); -} - /* * The module name should be the only globally exported symbol. * That is, everything else should be 'static'. @@ -1245,7 +1241,6 @@ module_rlm_t rlm_rest = { .thread_inst_size = sizeof(rlm_rest_thread_t), .config = module_config, .onload = mod_load, - .unload = mod_unload, .bootstrap = mod_bootstrap, .instantiate = instantiate, .thread_instantiate = mod_thread_instantiate, diff --git a/src/modules/rlm_smtp/rlm_smtp.c b/src/modules/rlm_smtp/rlm_smtp.c index fc04edcfca6..8f5b19a8b2c 100644 --- a/src/modules/rlm_smtp/rlm_smtp.c +++ b/src/modules/rlm_smtp/rlm_smtp.c @@ -27,6 +27,7 @@ RCSID("$Id$") #include #include #include +#include #include #include #include @@ -59,6 +60,12 @@ fr_dict_attr_autoload_t rlm_smtp_dict_attr[] = { { NULL }, }; +extern global_lib_autoinst_t const * const rlm_smtp_lib[]; +global_lib_autoinst_t const * const rlm_smtp_lib[] = { + &fr_curl_autoinst, + GLOBAL_LIB_TERMINATOR +}; + typedef struct { char const *uri; //!< URI of smtp server char const *template_dir; //!< The directory that contains all email attachments @@ -1002,23 +1009,6 @@ static unlang_action_t CC_HINT(nonnull(1,2)) mod_authenticate(rlm_rcode_t *p_res return unlang_module_yield(request, mod_authenticate_resume, NULL, randle); } -/* - * Initialize global curl instance - */ -static int mod_load(void) -{ - if (fr_curl_init() < 0) return -1; - return 0; -} - -/* - * Close global curl instance - */ -static void mod_unload(void) -{ - fr_curl_free(); -} - /** Verify that a map in the header section makes sense * */ @@ -1117,8 +1107,6 @@ module_rlm_t rlm_smtp = { .config = module_config, .bootstrap = mod_bootstrap, .instantiate = mod_instantiate, - .onload = mod_load, - .unload = mod_unload, .thread_instantiate = mod_thread_instantiate, .thread_detach = mod_thread_detach, },