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 <linkmauve@linkmauve.fr>
Reviewed-by: Eric Engestrom <eric.engestrom@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2026>
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
*/
#if defined(__linux__)
+#if defined(HAVE_GETRANDOM)
+#include <sys/random.h>
+#endif
#include <sys/file.h>
#include <unistd.h>
#include <fcntl.h>
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;