summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--random.c8
2 files changed, 13 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 3aba54b..23f82a7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Jul 25 21:03:45 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (fill_random_bytes_syscall): get rid of blocking when
+ no entropy is available. based on the patch by mame in
+ [ruby-core:70114]. [Bug #11395]
+
Sat Jul 25 11:05:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* string.c (str_replace_shared_without_enc): fill the terminator
diff --git a/random.c b/random.c
index 6452456..9f39dc2 100644
--- a/random.c
+++ b/random.c
@@ -516,6 +516,12 @@ fill_random_bytes_syscall(void *seed, size_t size)
return 0;
}
#elif defined __linux__ && defined SYS_getrandom
+#include <linux/random.h>
+
+# ifndef GRND_NONBLOCK
+# define GRND_NONBLOCK 0x0001 /* not defined in musl libc */
+# endif
+
static int
fill_random_bytes_syscall(void *seed, size_t size)
{
@@ -523,7 +529,7 @@ fill_random_bytes_syscall(void *seed, size_t size)
if (try_syscall) {
long ret;
errno = 0;
- ret = syscall(SYS_getrandom, seed, size, 0);
+ ret = syscall(SYS_getrandom, seed, size, GRND_NONBLOCK);
if (errno == ENOSYS) {
try_syscall = 0;
return -1;