ruby-core

Mailing list archive

[ruby-core:70116] [Ruby trunk - Bug #11395] ruby gets stuck when entropy_avail is 0

From: nobu@...
Date: 2015-07-25 02:53:22 UTC
List: ruby-core #70116
Issue #11395 has been updated by Nobuyoshi Nakada.

Description updated

including <linux/random.h>?

And checking `errno` with `EAGAIN` doesn't seem necessary since the return value should not equal to `size`.

~~~diff
diff --git i/random.c w/random.c
index 6452456..bea5f85 100644
--- i/random.c
+++ w/random.c
@@ -516,6 +516,8 @@ fill_random_bytes_syscall(void *seed, size_t size)
     return 0;
 }
 #elif defined __linux__ && defined SYS_getrandom
+#include <linux/random.h>
+
 static int
 fill_random_bytes_syscall(void *seed, size_t size)
 {
@@ -523,7 +525,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;
~~~

----------------------------------------
Bug #11395: ruby gets stuck when entropy_avail is 0
https://bugs.ruby-lang.org/issues/11395#change-53547

* Author: Yusuke Endoh
* Status: Assigned
* Priority: Normal
* Assignee: Nobuyoshi Nakada
* ruby -v: ruby 2.3.0dev (2015-07-24 master 51364) [x86_64-linux]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
When `/proc/sys/kernel/random/entropy_avail` is 0, Ruby gets stuck during initialization.

    $ ruby -v
    (stuck)

This is caused by r51182.  I think that the `GRND_NONBLOCK` flag should be set to `getrandom` syscall.

The following patch works for me.  But I have no idea to remove the magic number "1 (= `GRND_NONBLOCK`)".

~~~~diff
diff --git a/random.c b/random.c
index 6452456..9ef89f9 100644
--- a/random.c
+++ b/random.c
@@ -523,11 +523,14 @@ 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, 1);
 	if (errno == ENOSYS) {
 	    try_syscall = 0;
 	    return -1;
 	}
+	if (errno == EAGAIN) {
+	    return -1;
+	}
 	if ((size_t)ret == size) return 0;
     }
     return -1;
~~~~

-- 
Yusuke Endoh <mame@ruby-lang.org>



-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next