40 lines
1.5 KiB
Diff
40 lines
1.5 KiB
Diff
|
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",
|