Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP4:GA
openwsman
0020-Fix-SSL-library-usage-is-not-thread-safe.p...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0020-Fix-SSL-library-usage-is-not-thread-safe.patch of Package openwsman
From d51c4dee9f48e4c334a001d54bb2535128c86625 Mon Sep 17 00:00:00 2001 From: Vitezslav Crhonek <vcrhonek@redhat.com> Date: Tue, 16 Feb 2016 15:19:22 +0100 Subject: [PATCH] Fix SSL library usage is not thread safe --- src/server/wsmand-listener.c | 56 ++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/server/wsmand-listener.c b/src/server/wsmand-listener.c index 03b220d375ec..65f4b6e05ee9 100644 --- a/src/server/wsmand-listener.c +++ b/src/server/wsmand-listener.c @@ -83,6 +83,10 @@ #endif #include <sys/socket.h> +/* SSL thread safe */ +#include <openssl/crypto.h> +static pthread_mutex_t *lock_cs; +static long *lock_count; static pthread_mutex_t shttpd_mutex; static pthread_cond_t shttpd_cond; @@ -107,6 +111,50 @@ char * gss_decrypt(struct shttpd_arg *arg, char *data, int len); int gss_encrypt(struct shttpd_arg *arg, char *input, int inlen, char **output, int *outlen); #endif +/* SSL thread safe */ +void pthreads_locking_callback(int mode, int type, char *file, int line) { + if (mode & CRYPTO_LOCK) { + pthread_mutex_lock(&(lock_cs[type])); + lock_count[type]++; + } + else { + pthread_mutex_unlock(&(lock_cs[type])); + } +} + +unsigned long pthreads_thread_id(void) { + unsigned long ret; + + ret = (unsigned long)pthread_self(); + return(ret); +} + +void thread_setup(void) { + int i; + + lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); + lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long)); + for (i = 0; i < CRYPTO_num_locks(); i++) { + lock_count[i] = 0; + pthread_mutex_init(&(lock_cs[i]), NULL); + } + + CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id); + CRYPTO_set_locking_callback((void (*)())pthreads_locking_callback); +} + +void thread_cleanup(void) { + int i; + + CRYPTO_set_locking_callback(NULL); + for (i = 0; i < CRYPTO_num_locks(); i++) { + pthread_mutex_destroy(&(lock_cs[i])); + } + + OPENSSL_free(lock_cs); + OPENSSL_free(lock_count); +} + /* Check HTTP headers */ static int check_request_content_type(struct shttpd_arg *arg) { @@ -723,6 +771,10 @@ WsManListenerH *wsmand_start_server(dictionary * ini) if (wsman_setup_thread(&pattrs) == 0 ) return listener; + + /* SSL thread safe */ + thread_setup(); + pthread_create(&tid, &pattrs, wsman_server_auxiliary_loop_thread, cntx); #ifdef ENABLE_EVENTING_SUPPORT @@ -749,5 +801,9 @@ WsManListenerH *wsmand_start_server(dictionary * ini) } shttpd_add_socket(thread->ctx, sock, use_ssl); } + + /* SSL thread safe */ + thread_cleanup(); + return listener; } -- 2.24.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor