Fix building on Linux/macOS after r366622

We have to bootstrap arc4random.c, so guard the FenestrasX code to avoid
using it on Linux/macOS.

Reviewed By:	cem
Differential Revision: https://reviews.freebsd.org/D26738
This commit is contained in:
Alex Richardson 2020-10-12 10:42:14 +00:00
parent c50f409c15
commit c2ca066705
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=366632
2 changed files with 13 additions and 1 deletions

View File

@ -46,6 +46,11 @@ __FBSDID("$FreeBSD$");
#define CHACHA_EMBED
#define KEYSTREAM_ONLY
#if defined(__FreeBSD__)
#define ARC4RANDOM_FXRNG 1
#else
#define ARC4RANDOM_FXRNG 0
#endif
#include "chacha.c"
#define minimum(a, b) ((a) < (b) ? (a) : (b))

View File

@ -27,9 +27,11 @@
#include <sys/elf.h>
#include <sys/endian.h>
#include <sys/mman.h>
#if ARC4RANDOM_FXRNG != 0
#include <sys/time.h> /* for sys/vdso.h only. */
#include <sys/vdso.h>
#include <machine/atomic.h>
#endif
#include <err.h>
#include <errno.h>
@ -37,6 +39,7 @@
#include <stdbool.h>
#include <stdint.h>
#if ARC4RANDOM_FXRNG != 0
/*
* The kernel root seed version is a 64-bit counter, but we truncate it to a
* 32-bit value in userspace for the convenience of 32-bit platforms. 32-bit
@ -51,6 +54,7 @@
*/
#define fxrng_load_acq_generation(x) atomic_load_acq_32(x)
static struct vdso_fxrng_generation_1 *vdso_fxrngp;
#endif
static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
#define _ARC4_LOCK() \
@ -74,6 +78,7 @@ _getentropy_fail(void)
static inline void
_rs_initialize_fxrng(void)
{
#if ARC4RANDOM_FXRNG != 0
struct vdso_fxrng_generation_1 *fxrngp;
int error;
@ -91,6 +96,7 @@ _rs_initialize_fxrng(void)
return;
vdso_fxrngp = fxrngp;
#endif
}
static inline int
@ -131,13 +137,14 @@ _rs_forkdetect(void)
/* Detect fork (minherit(2) INHERIT_ZERO). */
if (__predict_false(rs == NULL || rsx == NULL))
return;
#if ARC4RANDOM_FXRNG != 0
/* If present, detect kernel FenestrasX seed version change. */
if (vdso_fxrngp == NULL)
return;
if (__predict_true(rsx->rs_seed_generation ==
fxrng_load_acq_generation(&vdso_fxrngp->fx_generation32)))
return;
#endif
/* Invalidate rs_buf to force "stir" (reseed). */
memset(rs, 0, sizeof(*rs));
}