diff --git a/src/modules/tls/tls_init.c b/src/modules/tls/tls_init.c index e4a19d6ddad..7824245813b 100644 --- a/src/modules/tls/tls_init.c +++ b/src/modules/tls/tls_init.c @@ -69,20 +69,31 @@ static int tls_mod_preinitialized = 0; static int tls_mod_initialized = 0; extern int ksr_tls_init_mode; -pthread_mutex_t ksr_tls_lock_shm; +static pthread_mutex_t *ksr_tls_lock_shm = NULL; /** * */ int ksr_tls_lock_init(void) { + pthread_mutexattr_t attr; + if(!(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM)) { return 0; } - if(pthread_mutex_init(&ksr_tls_lock_shm, NULL) != 0) { + ksr_tls_lock_shm = (pthread_mutex_t *)shm_mallocxz(sizeof(pthread_mutex_t)); + if(ksr_tls_lock_shm == NULL) { + LM_ERR("mutex allocation failed\n"); + return -1; + } + pthread_mutexattr_init(&attr); + pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + if(pthread_mutex_init(ksr_tls_lock_shm, &attr) != 0) { + pthread_mutexattr_destroy(&attr); LM_ERR("mutex init failed\n"); return -1; } + pthread_mutexattr_destroy(&attr); return 0; } @@ -94,7 +105,8 @@ void ksr_tls_lock_destroy(void) if(!(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM)) { return; } - pthread_mutex_destroy(&ksr_tls_lock_shm); + pthread_mutex_destroy(ksr_tls_lock_shm); + shm_free(ksr_tls_lock_shm); return; } @@ -248,7 +260,7 @@ static void *ser_malloc(size_t size, const char *file, int line) #endif if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_lock(&ksr_tls_lock_shm); + pthread_mutex_lock(ksr_tls_lock_shm); #ifdef RAND_NULL_MALLOC /* start random null returns only after @@ -277,7 +289,7 @@ static void *ser_malloc(size_t size, const char *file, int line) } #endif if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_unlock(&ksr_tls_lock_shm); + pthread_mutex_unlock(ksr_tls_lock_shm); return p; } @@ -292,7 +304,7 @@ static void *ser_realloc(void *ptr, size_t size, const char *file, int line) #endif if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_lock(&ksr_tls_lock_shm); + pthread_mutex_lock(ksr_tls_lock_shm); #ifdef RAND_NULL_MALLOC /* start random null returns only after @@ -322,7 +334,7 @@ static void *ser_realloc(void *ptr, size_t size, const char *file, int line) #endif if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_unlock(&ksr_tls_lock_shm); + pthread_mutex_unlock(ksr_tls_lock_shm); return p; } @@ -330,12 +342,12 @@ static void *ser_realloc(void *ptr, size_t size, const char *file, int line) static void ser_free(void *ptr, const char *fname, int fline) { if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_lock(&ksr_tls_lock_shm); + pthread_mutex_lock(ksr_tls_lock_shm); if(ptr) { shm_free(ptr); } if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_unlock(&ksr_tls_lock_shm); + pthread_mutex_unlock(ksr_tls_lock_shm); } #endif /* LIBRESSL_VERSION_NUMBER */ @@ -350,10 +362,10 @@ static void *ser_malloc(size_t size) void *p; if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_lock(&ksr_tls_lock_shm); + pthread_mutex_lock(ksr_tls_lock_shm); p = shm_malloc(size); if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_unlock(&ksr_tls_lock_shm); + pthread_mutex_unlock(ksr_tls_lock_shm); return p; } @@ -362,10 +374,10 @@ static void *ser_realloc(void *ptr, size_t size) { void *p; if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_lock(&ksr_tls_lock_shm); + pthread_mutex_lock(ksr_tls_lock_shm); p = shm_realloc(ptr, size); if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_unlock(&ksr_tls_lock_shm); + pthread_mutex_unlock(ksr_tls_lock_shm); return p; } #else @@ -373,10 +385,10 @@ static void *ser_malloc(size_t size, const char *fname, int fline) { void *p; if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_lock(&ksr_tls_lock_shm); + pthread_mutex_lock(ksr_tls_lock_shm); p = shm_malloc(size); if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_unlock(&ksr_tls_lock_shm); + pthread_mutex_unlock(ksr_tls_lock_shm); return p; } @@ -385,10 +397,10 @@ static void *ser_realloc(void *ptr, size_t size, const char *fname, int fline) { void *p; if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_lock(&ksr_tls_lock_shm); + pthread_mutex_lock(ksr_tls_lock_shm); p = shm_realloc(ptr, size); if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_unlock(&ksr_tls_lock_shm); + pthread_mutex_unlock(ksr_tls_lock_shm); return p; } #endif @@ -406,23 +418,23 @@ static void ser_free(void *ptr) * here in the wrapper function. */ if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_lock(&ksr_tls_lock_shm); + pthread_mutex_lock(ksr_tls_lock_shm); if(ptr) { shm_free(ptr); } if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_unlock(&ksr_tls_lock_shm); + pthread_mutex_unlock(ksr_tls_lock_shm); } #else static void ser_free(void *ptr, const char *fname, int fline) { if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_lock(&ksr_tls_lock_shm); + pthread_mutex_lock(ksr_tls_lock_shm); if(ptr) { shm_free(ptr); } if(ksr_tls_init_mode & TLS_MODE_PTHREAD_LOCK_SHM) - pthread_mutex_unlock(&ksr_tls_lock_shm); + pthread_mutex_unlock(ksr_tls_lock_shm); } #endif diff --git a/src/modules/tls/tls_mod.c b/src/modules/tls/tls_mod.c index c966e34b6f8..3a047769ca4 100644 --- a/src/modules/tls/tls_mod.c +++ b/src/modules/tls/tls_mod.c @@ -402,10 +402,6 @@ static int mod_init(void) if(tls_check_sockets(*tls_domains_cfg) < 0) goto error; - if(ksr_tls_lock_init() < 0) { - goto error; - } - LM_INFO("use OpenSSL version: %08x\n", (uint32_t)(OPENSSL_VERSION_NUMBER)); #ifndef OPENSSL_NO_ECDH LM_INFO("With ECDH-Support!\n"); @@ -674,6 +670,10 @@ int mod_register(char *path, int *dlflags, void *p1, void *p2) if(!shm_initialized() && init_shm() < 0) return -1; + if(ksr_tls_lock_init() < 0) { + return -1; + } + if(tls_pre_init() < 0) return -1;