Skip to content

Commit

Permalink
OpenSSL integration: manage curl_global_init(...) used by modules
Browse files Browse the repository at this point in the history
- http_client, http_async_client, xcap_client use libcurl
- call curl_global_init in a thread executor as it invokes
  OpenSSL functions on Debian 12
- clang-format
  • Loading branch information
space88man committed Feb 26, 2024
1 parent b98718c commit ac4f1be
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 11 deletions.
38 changes: 38 additions & 0 deletions src/core/rthreads.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,3 +254,41 @@ static int run_thread4P5I2P2(_thread_proto4P5I2P2 fn, void *arg1, void *arg2,
#endif
}
#endif

/*
* prototype: CURLcode curl_global_init(long flags) { ... }
*/
#ifdef KSR_RTHREAD_NEED_4L
typedef int (*_thread_proto4L)(long);
struct _thread_args4L
{
_thread_proto4L fn;
long arg1;
int *ret;
};
static void *run_thread_wrap4L(struct _thread_args4L *args)
{
*args->ret = (*args->fn)(args->arg1);
return NULL;
}

static int run_thread4L(_thread_proto4L fn, long arg1)
{
#ifdef USE_TLS
pthread_t tid;
int ret;

if(likely(ksr_tls_threads_mode == 0
|| (ksr_tls_threads_mode == 1 && process_no > 0))) {
return fn(arg1);
}
pthread_create(&tid, NULL, (_thread_proto)run_thread_wrap4L,
&(struct _thread_args4L){fn, arg1, &ret});
pthread_join(tid, NULL);

return ret;
#else
return fn(arg1)
#endif
}
#endif
6 changes: 5 additions & 1 deletion src/modules/http_async_client/http_multi.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@
#include "../../core/mem/mem.h"
#include "../../core/ut.h"
#include "../../core/hashes.h"
#define KSR_RTHREAD_NEED_4L
#define KSR_RTHREAD_SKIP_P
#include "../../core/rthreads.h"
#include "http_multi.h"

extern int hash_size;
Expand Down Expand Up @@ -389,7 +392,8 @@ void set_curl_mem_callbacks(void)
break;
case 1:
LM_DBG("Initilizing cURL with sys malloc\n");
rc = curl_global_init(CURL_GLOBAL_ALL);
rc = run_thread4L(
(_thread_proto4L)curl_global_init, CURL_GLOBAL_ALL);
if(rc != 0) {
LM_ERR("Cannot initialize cURL: %d\n", rc);
}
Expand Down
23 changes: 14 additions & 9 deletions src/modules/http_client/http_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@
#include "../../core/lvalue.h"
#include "../../core/pt.h" /* Process table */
#include "../../core/kemi.h"
#define KSR_RTHREAD_NEED_4L
#define KSR_RTHREAD_SKIP_P
#include "../../core/rthreads.h"

#include "functions.h"
#include "curlcon.h"
Expand All @@ -76,8 +79,10 @@ MODULE_VERSION
#define CURL_USER_AGENT_LEN (sizeof(CURL_USER_AGENT) - 1)

/* Module parameter variables */
unsigned int default_connection_timeout = 0; /*!< 0 = not user configured - the default (4 seconds) will be used */
unsigned int timeout_mode = 1; /*!< 0 = timeout disabled, 1 (default) = timeout in seconds, 2 = timeout in ms */
unsigned int default_connection_timeout =
0; /*!< 0 = not user configured - the default (4 seconds) will be used */
unsigned int timeout_mode =
1; /*!< 0 = timeout disabled, 1 (default) = timeout in seconds, 2 = timeout in ms */
char *default_tls_cacert =
NULL; /*!< File name: Default CA cert to use for curl TLS connection */
str default_tls_clientcert =
Expand Down Expand Up @@ -280,7 +285,7 @@ static int mod_init(void)
LM_DBG("init curl module\n");

/* Initialize curl */
if(curl_global_init(CURL_GLOBAL_ALL)) {
if(run_thread4L((_thread_proto4L)&curl_global_init, CURL_GLOBAL_ALL)) {
LM_ERR("curl_global_init failed\n");
return -1;
}
Expand Down Expand Up @@ -317,16 +322,16 @@ static int mod_init(void)
* - 1 (default) : timeout value is in seconds.
* - 2 : timeout value is in milliseconds.
*/
if (!(timeout_mode == 1 || timeout_mode == 2)) {
if (default_connection_timeout > 0) {
if(!(timeout_mode == 1 || timeout_mode == 2)) {
if(default_connection_timeout > 0) {
LM_WARN("configured connection_timeout is ignored "
"because timeouts are disabled (timeout_mode)\n");
"because timeouts are disabled (timeout_mode)\n");
}
} else if (default_connection_timeout == 0) {
} else if(default_connection_timeout == 0) {
LM_INFO("curl connection timeout set to zero. Using default 4 secs\n");
if (timeout_mode == 1) { /* timeout is in seconds (default) */
if(timeout_mode == 1) { /* timeout is in seconds (default) */
default_connection_timeout = 4;
} else if (timeout_mode == 2) { /* timeout is in milliseconds */
} else if(timeout_mode == 2) { /* timeout is in milliseconds */
default_connection_timeout = 4000;
}
}
Expand Down
5 changes: 4 additions & 1 deletion src/modules/xcap_client/xcap_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@
#include "../../core/mem/shm_mem.h"
#include "../../core/rpc.h"
#include "../../core/rpc_lookup.h"
#define KSR_RTHREAD_NEED_4L
#define KSR_RTHREAD_SKIP_P
#include "../../core/rthreads.h"
#include "../presence/utils_func.h"
#include "xcap_functions.h"
#include "xcap_client.h"
Expand Down Expand Up @@ -140,7 +143,7 @@ static int mod_init(void)
xcap_dbf.close(xcap_db);
xcap_db = NULL;

curl_global_init(CURL_GLOBAL_ALL);
run_thread4L((_thread_proto4L)curl_global_init, CURL_GLOBAL_ALL);

if(periodical_query) {
register_timer(query_xcap_update, 0, query_period);
Expand Down

0 comments on commit ac4f1be

Please sign in to comment.