aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRich Salz <rsalz@openssl.org>2017-08-18 11:47:21 -0400
committerRich Salz <rsalz@openssl.org>2017-08-18 11:48:35 -0400
commitb842fcbb37cf3cded72dd7706abd8d54a10cd508 (patch)
tree4355c6876d774102074d8e445bf2c0f54dc12160
parent10ed1b72391ded9853bec417d4d32bd6ec45f916 (diff)
downloadopenssl-b842fcbb37cf3cded72dd7706abd8d54a10cd508.tar.gz
Put thread-fork-init inside a run-once guard
Thanks to Christian Heimes for pointing this out. Reviewed-by: Andy Polyakov <appro@openssl.org> (Merged from https://github.com/openssl/openssl/pull/4191)
-rw-r--r--crypto/threads_pthread.c13
1 files 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;