]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use TLS variables to store RNG state, make RNG lockless
authorWitold Kręcicki <wpk@isc.org>
Fri, 24 Aug 2018 09:21:27 +0000 (11:21 +0200)
committerWitold Kręcicki <wpk@isc.org>
Sat, 25 Aug 2018 11:26:25 +0000 (13:26 +0200)
CHANGES
lib/dns/tests/dnstest.c
lib/isc/random.c
lib/isc/xoshiro128starstar.c
lib/ns/tests/nstest.c

diff --git a/CHANGES b/CHANGES
index feacd1837361b71b3aa473f94dfd99c7cd321f00..03bafd02bfd06009cbad378eacda1bddd797f663 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+5020.  [func]          RNG uses thread-local storage instead of locks, if
+                       supported by platform. [GL #496]
+
 5019.  [cleanup]       A message is now logged when ixfr-from-differences is
                        set at zone level for an inline-signed zone. [GL #470]
 
index 11f344838afb833528900c8330f593bd549543e7..3761abc7f06bfc44262c62cccae3d2ee43ccc417 100644 (file)
@@ -161,18 +161,19 @@ dns_test_begin(FILE *logfile, bool start_managers) {
 
 void
 dns_test_end(void) {
+       cleanup_managers();
+
        if (dst_active) {
                dst_lib_destroy();
                dst_active = false;
        }
 
-       cleanup_managers();
-
        if (lctx != NULL)
                isc_log_destroy(&lctx);
 
        if (mctx != NULL)
                isc_mem_destroy(&mctx);
+
 }
 
 /*
index 63b84cd46f6b95c773a684316b3f6e7db80f4f2a..9cf635a37f117795fdfc13bed2a9f011ccc78810 100644 (file)
  */
 #include "xoshiro128starstar.c"
 
+#if defined(HAVE_TLS)
+#if defined(HAVE_THREAD_LOCAL)
+static thread_local isc_once_t isc_random_once = ISC_ONCE_INIT;
+#elif defined(HAVE___THREAD)
+static __thread isc_once_t isc_random_once = ISC_ONCE_INIT;
+#else
+#error "Unknown method for defining a TLS variable!"
+#endif
+#else
 static isc_once_t isc_random_once = ISC_ONCE_INIT;
+#endif
 
 static void
 isc_random_initialize(void) {
 #if FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
        memset(seed, 0, sizeof(seed));
 #else
-       isc_entropy_get(seed, sizeof(seed));
+       int useed[4] = {0,0,0,0};
+       isc_entropy_get(useed, sizeof(useed));
+       memcpy(seed, useed, sizeof(seed));
 #endif
 }
 
index bff2e3ad384c9c1e2756a9a68887259eeba24da5..9df1b4ba74d3013df14a43886c3808435ea3903e 100644 (file)
  *
  * The state must be seeded so that it is not everywhere zero.
  */
+#if defined(HAVE_TLS)
+#define _LOCK() {};
+#define _UNLOCK() {};
+
+#if defined(HAVE_THREAD_LOCAL)
+static thread_local uint32_t seed[4];
+#elif defined(HAVE___THREAD)
+static __thread uint32_t seed[4];
+#else
+#error "Unknown method for defining a TLS variable!"
+#endif
+
+#else
 #if defined(_WIN32) || defined(_WIN64)
 #include <windows.h>
 static volatile HANDLE _mutex = NULL;
@@ -65,12 +78,14 @@ static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;
 #define _UNLOCK() pthread_mutex_unlock(&_mutex)
 #endif /* defined(_WIN32) || defined(_WIN64) */
 
+static uint32_t seed[4];
+
+#endif /* defined(HAVE_TLS) */
+
 static inline uint32_t rotl(const uint32_t x, int k) {
        return (x << k) | (x >> (32 - k));
 }
 
-static uint32_t seed[4];
-
 static inline uint32_t
 next(void) {
        uint32_t result_starstar, t;
index ccbe1f65a62b9e7c870d04cafaca9993b5d77c5f..662426f75d3355acd6a577abb348950df9ecd132 100644 (file)
@@ -277,13 +277,13 @@ ns_test_begin(FILE *logfile, bool start_managers) {
 
 void
 ns_test_end(void) {
+       cleanup_managers();
+
        if (dst_active) {
                dst_lib_destroy();
                dst_active = false;
        }
 
-       cleanup_managers();
-
        if (lctx != NULL)
                isc_log_destroy(&lctx);