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 4b0db83..718f080 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 a8036c1..750cb1a 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 4f1b4af..58f865b 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 58665f5..44ebe25 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 df5fe47..7bd8a72 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}