From 4c212a1168de9ffc83a7b8e8751ea7cf3dca5c4a Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Wed, 18 Sep 2019 13:20:57 +0200 Subject: [PATCH] util/rand_xor: use getrandom() when available MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This function has been added in glibc 2.25, and the related syscall in Linux 3.17, in order to avoid requiring the /dev/urandom to exist, and doing the open()/read()/close() dance on it. We pass GRND_NONBLOCK so that it doesn’t block if not enough entropy has been gathered to initialise the /dev/urandom source, and fallback to the next source in any error case. Signed-off-by: Emmanuel Gil Peyrot Reviewed-by: Eric Engestrom Part-of: --- meson.build | 2 +- src/util/rand_xor.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index ba4fdb2a59f..1a207842c55 100644 --- a/meson.build +++ b/meson.build @@ -1163,7 +1163,7 @@ foreach h : ['xlocale.h', 'sys/sysctl.h', 'linux/futex.h', 'endian.h', 'dlfcn.h' endif endforeach -foreach f : ['strtof', 'mkostemp', 'timespec_get', 'memfd_create', 'random_r', 'flock', 'strtok_r'] +foreach f : ['strtof', 'mkostemp', 'timespec_get', 'memfd_create', 'random_r', 'flock', 'strtok_r', 'getrandom'] if cc.has_function(f) pre_args += '-DHAVE_@0@'.format(f.to_upper()) endif diff --git a/src/util/rand_xor.c b/src/util/rand_xor.c index de04bbc284f..31612d57660 100644 --- a/src/util/rand_xor.c +++ b/src/util/rand_xor.c @@ -23,6 +23,9 @@ */ #if defined(__linux__) +#if defined(HAVE_GETRANDOM) +#include +#endif #include #include #include @@ -58,11 +61,18 @@ s_rand_xorshift128plus(uint64_t *seed, bool randomised_seed) goto fixed_seed; #if defined(__linux__) + size_t seed_size = sizeof(uint64_t) * 2; + +#if defined(HAVE_GETRANDOM) + ssize_t ret = getrandom(seed, seed_size, GRND_NONBLOCK); + if (ret == seed_size) + return; +#endif + int fd = open("/dev/urandom", O_RDONLY); if (fd < 0) goto fixed_seed; - size_t seed_size = sizeof(uint64_t) * 2; if (read(fd, seed, seed_size) != seed_size) { close(fd); goto fixed_seed; -- 2.30.2