Fix race between first rand(3) calls.
Before this patch there was a chance for thread that called rand(3) slightly later to see rand3_state already allocated, but not yet initialized. While this API is not expected to be thread-safe, it is not expected to crash. ztest on 64-thread system reproduced it reliably for me. MFC after: 1 month
This commit is contained in:
parent
5a9e5a5111
commit
28d70deaaf
@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <syslog.h>
|
||||
#include <machine/atomic.h>
|
||||
#include "un-namespace.h"
|
||||
|
||||
#include "random.h"
|
||||
@ -68,11 +69,15 @@ static struct __random_state *rand3_state;
|
||||
static void
|
||||
initialize_rand3(void)
|
||||
{
|
||||
struct __random_state *state;
|
||||
int error;
|
||||
|
||||
rand3_state = allocatestate(TYPE_3);
|
||||
error = initstate_r(rand3_state, 1, rand3_state->rst_randtbl, BREAK_3);
|
||||
state = allocatestate(TYPE_3);
|
||||
error = initstate_r(state, 1, state->rst_randtbl, BREAK_3);
|
||||
assert(error == 0);
|
||||
if (!atomic_cmpset_rel_ptr((volatile uintptr_t *)&rand3_state,
|
||||
(uintptr_t)NULL, (uintptr_t)state))
|
||||
free(state);
|
||||
}
|
||||
|
||||
int
|
||||
|
Loading…
Reference in New Issue
Block a user