Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ISC Open Source Projects
BIND
Commits
8c5aeb6c
Commit
8c5aeb6c
authored
Aug 24, 2018
by
Witold Krecicki
Browse files
Use TLS variables to store RNG state, make RNG lockless
parent
e79b42fe
Changes
5
Hide whitespace changes
Inline
Side-by-side
CHANGES
View file @
8c5aeb6c
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]
...
...
lib/dns/tests/dnstest.c
View file @
8c5aeb6c
...
...
@@ -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
);
}
/*
...
...
lib/isc/random.c
View file @
8c5aeb6c
...
...
@@ -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
}
...
...
lib/isc/xoshiro128starstar.c
View file @
8c5aeb6c
...
...
@@ -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
;
...
...
lib/ns/tests/nstest.c
View file @
8c5aeb6c
...
...
@@ -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
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment