[Mesa-dev] [PATCH v2] util/rand_xor: seed with getentropy when available

Jonathan Gray jsg at jsg.id.au
Thu Mar 23 06:19:54 UTC 2017


On Thu, Mar 23, 2017 at 03:24:16PM +1100, Jonathan Gray wrote:
> Instead of using using /dev/urandom on Linux and time(NULL) elsewhere
> for a seed first use getentropy() for systems that have a kernel
> interface to get a seed such as OpenBSD.  This interface is also
> present in other systems such as Solaris and even Linux with a recent
> version of glibc.
> 
> v2: check for/use the different header Solaris and glibc use
> 
> Signed-off-by: Jonathan Gray <jsg at jsg.id.au>

Even just changing the original to have the following would be an
improvement.

diff --git a/src/util/rand_xor.c b/src/util/rand_xor.c
index de05fa64b3..9780907368 100644
--- a/src/util/rand_xor.c
+++ b/src/util/rand_xor.c
@@ -22,12 +22,9 @@
  *
  */
 
-#if defined(__linux__)
-#include <sys/file.h>
+#include <fcntl.h>
 #include <unistd.h>
-#else
 #include <time.h>
-#endif
 
 #include "rand_xor.h"
 
@@ -53,29 +50,34 @@ rand_xorshift128plus(uint64_t *seed)
 void
 s_rand_xorshift128plus(uint64_t *seed, bool randomised_seed)
 {
+   time_t now;
+
    if (!randomised_seed)
       goto fixed_seed;
 
-#if defined(__linux__)
    int fd = open("/dev/urandom", O_RDONLY);
    if (fd < 0)
-      goto fixed_seed;
+      goto time_seed;
 
    size_t seed_size = sizeof(uint64_t) * 2;
    if (read(fd, seed, seed_size) != seed_size) {
       close(fd);
-      goto fixed_seed;
+      goto time_seed;
    }
 
    close(fd);
    return;
 
-#else
+time_seed:
+
+   now = time(NULL);
+   if (now == -1)
+      goto fixed_seed;
+
    seed[0] = 0x3bffb83978e24f88;
-   seed[1] = time(NULL);
+   seed[1] = now;
 
    return;
-#endif
 
 fixed_seed:
 


More information about the mesa-dev mailing list