Add ssl thread locking function for openssl 1.0 54/217254/1 accepted/tizen/unified/20191113.123549 submit/tizen/20191107.131533
authorSeonah Moon <seonah1.moon@samsung.com>
Fri, 8 Nov 2019 04:21:47 +0000 (13:21 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Fri, 8 Nov 2019 04:21:50 +0000 (13:21 +0900)
TV profile doesn't use openssl 1.1 yet.
So, this patch defines thread locking function for TV profile temporaly.
It will be removed or disabled after openssl 1.1 is applied to TV.

Change-Id: Ia7a029b898d85cd84552e0fffe0966e1e14dac8f

agent/CMakeLists.txt
agent/download-agent-dl-info.c
agent/download-agent-interface.c
agent/include/download-agent-dl-info.h
packaging/download-provider.spec

index 4b0db8321755e0ef10bc6fb85f1ade37b6504c21..718f080f52f551b24e124b77315d56a31b21461b 100755 (executable)
@@ -96,6 +96,11 @@ IF (SUPPORT_OMA_DRM)
        ADD_DEFINITIONS("-D_FILE_OFFSET_BITS=64")
 ENDIF (SUPPORT_OMA_DRM)
 
+IF (USE_SSL_THREAD_LOCKING)
+       MESSAGE("USE_SSL_THREAD_LOCKING(openssl<=1.0):On")
+       ADD_DEFINITIONS("-DUSE_SSL_THREAD_LOCKING")
+ENDIF (USE_SSL_THREAD_LOCKING)
+
 SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fpic -Wall -Werror -Werror-implicit-function-declaration")
 IF (BUILD_GTESTS)
        SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fvisibility=default")
index a8036c1b3e0c4ce405ceb7d4928850ebdd5a9a4a..750cb1a028b288a9b8a4dac496324834e575a985 100644 (file)
 #include <stdlib.h>
 #include <curl/curl.h>
 
+#ifdef USE_SSL_THREAD_LOCKING
+#include <openssl/crypto.h>
+#endif
+
 #include "download-agent-dl-info.h"
 #include "download-agent-http-mgr.h"
 #include "download-agent-http-msg-handler.h"
 static pthread_mutex_t mutex_da_info_list = PTHREAD_MUTEX_INITIALIZER;
 da_info_t *da_info_list[DA_MAX_ID];
 
+#ifdef USE_SSL_THREAD_LOCKING
+static pthread_mutex_t *g_openssl_locks_list;
+
+/* locking mechnism for safe use of openssl context */
+static void openssl_lock_callback(int mode, int type, char *file, int line)
+{
+       DA_LOGV("type [%d], mode [%d]", type, mode);
+       (void)file;
+       (void)line;
+
+       if (mode & CRYPTO_LOCK)
+               pthread_mutex_lock(&(g_openssl_locks_list[type]));
+       else
+               pthread_mutex_unlock(&(g_openssl_locks_list[type]));
+}
+
+static unsigned long thread_id(void)
+{
+       unsigned long ret = (unsigned long)pthread_self();
+       return ret;
+}
+
+da_ret_t init_openssl_locks(void)
+{
+       DA_LOGD("");
+       int index;
+       int crypto_num_locks = CRYPTO_num_locks();
+       DA_LOGD("crypto_num_locks [%d]", crypto_num_locks);
+       g_openssl_locks_list = (pthread_mutex_t *)OPENSSL_malloc(crypto_num_locks * sizeof(pthread_mutex_t));
+       if (g_openssl_locks_list == DA_NULL) {
+               DA_LOGE("Failed to OPENSSL_malloc");
+               return DA_ERR_FAIL_TO_MEMALLOC;
+       }
+       for (index = 0; index < crypto_num_locks; index++)
+               pthread_mutex_init(&(g_openssl_locks_list[index]), NULL);
+
+       CRYPTO_set_id_callback((unsigned long (*)())thread_id);
+       CRYPTO_set_locking_callback((void (*)())openssl_lock_callback);
+
+       return DA_RESULT_OK;
+}
+da_ret_t deinit_openssl_locks(void)
+{
+       DA_LOGD("");
+       int index;
+       int crypto_num_locks = CRYPTO_num_locks();
+       for (index = 0; index < crypto_num_locks; index++)
+               pthread_mutex_destroy(&(g_openssl_locks_list[index]));
+
+       CRYPTO_set_id_callback(NULL);
+       CRYPTO_set_locking_callback(NULL);
+       OPENSSL_free(g_openssl_locks_list);
+       g_openssl_locks_list = NULL;
+
+       return DA_RESULT_OK;
+}
+#endif
+
 static void __init_da_info(int id)
 {
        da_info_t *da_info = DA_NULL;
index 4f1b4afb6014655387d4c9a4c4ac55f912a7a807..58f865b850029d2edc31a437e9cd229f2a64903d 100755 (executable)
 int da_init()
 {
        DA_LOGV("");
-       return DA_RESULT_OK;
+       da_ret_t ret = DA_RESULT_OK;
+#ifdef USE_SSL_THREAD_LOCKING
+       ret = init_openssl_locks();
+       DA_LOGI("Return ret = %d", ret);
+#endif
+       return ret;
 }
 
 int da_deinit()
@@ -29,6 +34,9 @@ int da_deinit()
 
        DA_LOGV("");
        destroy_da_info_list();
+#ifdef USE_SSL_THREAD_LOCKING
+       deinit_openssl_locks();
+#endif
        DA_LOGI("====== da_deint EXIT =====");
        return ret;
 }
index 58665f51c57aa0fa6a273ef0124bdb6973a1948f..44ebe25915b5d4dc6361cb6615139d499e2a0af2 100644 (file)
@@ -181,6 +181,11 @@ extern da_info_t *da_info_list[DA_MAX_ID];
        DA_MUTEX_UNLOCK(&GET_STATE_MUTEX(INFO));\
        }
 
+#ifdef USE_SSL_THREAD_LOCKING
+da_ret_t init_openssl_locks(void);
+da_ret_t deinit_openssl_locks(void);
+#endif
+
 da_ret_t get_available_da_id(int *available_id);
 da_ret_t copy_user_input_data(da_info_t *da_info, const char *url,
                req_data_t *ext_data, da_cb_t *da_cb_data);
index df5fe47509aa75205e91065e279220b54a10888b..7bd8a727aebad4fc6bd3f9125c6e22c3889d320e 100755 (executable)
@@ -120,6 +120,9 @@ export LDFLAGS+=" -lgcov"
        -DBUILD_GTESTS=%{?gtests:1}%{!?gtests:0} \
        -DBUILD_GCOV=%{?gcov:1}%{!?gcov:0} \
        -DSUPPORT_LARGE_FILE:BOOL=ON \
+%if "%{?tizen_profile_name}" == "tv"
+       -DUSE_SSL_THREAD_LOCKING:BOOL=ON \
+%endif
        .
 
 make %{?jobs:-j%jobs}