From: Rich Salz Date: Fri, 18 Aug 2017 15:47:21 +0000 (-0400) Subject: Put thread-fork-init inside a run-once guard X-Git-Tag: OpenSSL_1_1_1-pre1~817 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=b842fcbb37cf3cded72dd7706abd8d54a10cd508;p=oweals%2Fopenssl.git 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) --- 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;