Mesa (master): util/rand_xor: use getrandom() when available

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri May 15 12:11:13 UTC 2020


Module: Mesa
Branch: master
Commit: 4c212a1168de9ffc83a7b8e8751ea7cf3dca5c4a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4c212a1168de9ffc83a7b8e8751ea7cf3dca5c4a

Author: Emmanuel Gil Peyrot <linkmauve at linkmauve.fr>
Date:   Wed Sep 18 13:20:57 2019 +0200

util/rand_xor: use getrandom() when available

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 at linkmauve.fr>
Reviewed-by: Eric Engestrom <eric.engestrom at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2026>

---

 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_ at 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 <sys/random.h>
+#endif
 #include <sys/file.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -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;



More information about the mesa-commit mailing list