Use TLS variables to store RNG state, make RNG lockless

This commit is contained in:
Witold Kręcicki
2018-08-24 11:21:27 +02:00
parent e79b42fec0
commit 8c5aeb6c4c
5 changed files with 38 additions and 7 deletions

View 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);
}
/*

View File

@@ -62,14 +62,26 @@
*/
#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
}

View File

@@ -34,6 +34,19 @@
*
* 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;

View 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);