From b842fcbb37cf3cded72dd7706abd8d54a10cd508 Mon Sep 17 00:00:00 2001 From: Rich Salz Date: Fri, 18 Aug 2017 11:47:21 -0400 Subject: [PATCH] Put thread-fork-init inside a run-once guard Thanks to Christian Heimes for pointing this out. Reviewed-by: Andy Polyakov (Merged from https://github.com/openssl/openssl/pull/4191) --- crypto/threads_pthread.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/crypto/threads_pthread.c b/crypto/threads_pthread.c index e28a2021b4..9644c25aea 100644 --- a/crypto/threads_pthread.c +++ b/crypto/threads_pthread.c @@ -169,11 +169,20 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) return 1; } +# ifdef OPENSSL_SYS_UNIX +static pthread_once_t fork_once_control = PTHREAD_ONCE_INIT; + +static void fork_once_func(void) +{ + pthread_atfork(OPENSSL_fork_prepare, + OPENSSL_fork_parent, OPENSSL_fork_child); +} +# endif + int openssl_init_fork_handlers(void) { # ifdef OPENSSL_SYS_UNIX - if (pthread_atfork(OPENSSL_fork_prepare, - OPENSSL_fork_parent, OPENSSL_fork_child) == 0) + if (pthread_once(&fork_once_control, fork_once_func) == 0) return 1; # endif return 0; -- 2.25.1