Blob Blame History Raw
diff -up libgcrypt-1.8.1/random/rndlinux.c.getrandom libgcrypt-1.8.1/random/rndlinux.c
--- libgcrypt-1.8.1/random/rndlinux.c.getrandom	2017-09-05 14:34:28.003872675 +0200
+++ libgcrypt-1.8.1/random/rndlinux.c	2017-12-04 09:48:38.704845838 +0100
@@ -35,6 +35,7 @@
 #include <poll.h>
 #if defined(__linux__) && defined(HAVE_SYSCALL)
 # include <sys/syscall.h>
+# include <linux/random.h>
 #endif
 
 #include "types.h"
@@ -204,6 +205,16 @@ _gcry_rndlinux_gather_random (void (*add
     {
       if (fd_urandom == -1)
         {
+#if defined(__linux__) && defined(HAVE_SYSCALL) && defined(__NR_getrandom)
+          long ret;
+
+          _gcry_pre_syscall ();
+          ret = syscall (__NR_getrandom,
+                         (void*)buffer, (size_t)1, (unsigned int)GRND_NONBLOCK);
+          _gcry_post_syscall ();
+        if (ret == -1 && errno == ENOSYS)
+          /* The syscall is not supported - fallback to /dev/urandom. */
+#endif
           fd_urandom = open_device (NAME_OF_DEV_URANDOM, (ever_opened & 2));
           ever_opened |= 2;
         }
@@ -246,9 +257,7 @@ _gcry_rndlinux_gather_random (void (*add
               _gcry_post_syscall ();
             }
           while (ret == -1 && errno == EINTR);
-          if (ret == -1 && errno == ENOSYS)
-            ; /* The syscall is not supported - fallback to /dev/urandom.  */
-          else
+          if (1)
             { /* The syscall is supported.  Some sanity checks.  */
               if (ret == -1)
                 log_fatal ("unexpected error from getrandom: %s\n",