From 32d9eeeecf4e951e1566d5f4a42b36ea37b60f35 Mon Sep 17 00:00:00 2001 From: Brent Cook Date: Tue, 15 Jul 2014 14:50:05 -0500 Subject: register the atfork handler from arc4random From kettenis@ People have suggested using pthread_atfork(3) before, but discarded the idea because it involves linking with -lpthread, which has other undesirable consequences. However: * Most systems actually have pthread_atfork(3) in libc. I verified this on OS X and Solaris. I believe this is the case on Linux systems that use musl as well. * On Linux systems that use glibc, this isn't the case. However, those systems have __register_atfork(3), which is fully documented in the "Linux Standard Base Core Specification". ok kettenis@ deraadt@ beck@ --- crypto/compat/thread_private.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/crypto/compat/thread_private.h b/crypto/compat/thread_private.h index 3286a7c..c5b0daf 100644 --- a/crypto/compat/thread_private.h +++ b/crypto/compat/thread_private.h @@ -4,3 +4,11 @@ static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER; #define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx) #define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx) + +#ifdef __GLIBC__ +extern void *__dso_handle; +extern int __register_atfork(void (*)(void), void(*)(void), void (*)(void), void *); +#define _ARC4_ATFORK(f) __register_atfork(NULL, NULL, (f), __dso_handle) +#else +#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f)) +#endif -- cgit v1.2.3-55-g6feb