Module: kamailio
Branch: 5.7
Commit: ed9d7bc58b1896652f2526daa524531a0945b7b3
URL: 
https://github.com/kamailio/kamailio/commit/ed9d7bc58b1896652f2526daa524531a0945b7b3

Author: S-P Chan <shihping.c...@gmail.com>
Committer: S-P Chan <shihping.c...@gmail.com>
Date: 2024-02-26T10:45:02+08:00

OpenSSL integration: manage curl_global_init(...) used by modules

- 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

Cherry-pick from ac4f1be039

---

Modified: src/core/rthreads.h
Modified: src/modules/http_async_client/http_multi.c
Modified: src/modules/http_client/http_client.c
Modified: src/modules/xcap_client/xcap_client.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/ed9d7bc58b1896652f2526daa524531a0945b7b3.diff
Patch: 
https://github.com/kamailio/kamailio/commit/ed9d7bc58b1896652f2526daa524531a0945b7b3.patch

---

diff --git a/src/core/rthreads.h b/src/core/rthreads.h
index e96f45c9395..0f4f0cf8b8a 100644
--- a/src/core/rthreads.h
+++ b/src/core/rthreads.h
@@ -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
diff --git a/src/modules/http_async_client/http_multi.c 
b/src/modules/http_async_client/http_multi.c
index a57aba9c951..a0ee1c877cf 100644
--- a/src/modules/http_async_client/http_multi.c
+++ b/src/modules/http_async_client/http_multi.c
@@ -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;
@@ -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);
                        }
diff --git a/src/modules/http_client/http_client.c 
b/src/modules/http_client/http_client.c
index 430933e23d2..3cf662820f5 100644
--- a/src/modules/http_client/http_client.c
+++ b/src/modules/http_client/http_client.c
@@ -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"
@@ -278,7 +281,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;
        }
diff --git a/src/modules/xcap_client/xcap_client.c 
b/src/modules/xcap_client/xcap_client.c
index ac77228bfde..4de2d367b63 100644
--- a/src/modules/xcap_client/xcap_client.c
+++ b/src/modules/xcap_client/xcap_client.c
@@ -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"
@@ -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);

_______________________________________________
Kamailio (SER) - Development Mailing List
To unsubscribe send an email to sr-dev-le...@lists.kamailio.org

Reply via email to