From: mame@... Date: 2015-07-25T12:45:34+00:00 Subject: [ruby-core:70121] [Ruby trunk - Bug #11395] ruby gets stuck when entropy_avail is 0 Issue #11395 has been updated by Yusuke Endoh. Sorry, r51374 may lead to a problem under the following situation. * the system uses a new libc that knows `SYS_getrandom`, but * the system uses an old linux kernel that does not know `getrandom` syscall. I guess it is not a good idea to determine the availability of `getrandom` by checking if `SYS_getrandom` is defined or not. Instead, it should check the runtime kernel version or something, though it is too ugly. I bet that we should not use the direct `syscall` but wait for libc to provide a wrapper function to getrandom. -- Yusuke Endoh <mame@ruby-lang.org> ---------------------------------------- Bug #11395: ruby gets stuck when entropy_avail is 0 https://bugs.ruby-lang.org/issues/11395#change-53553 * Author: Yusuke Endoh * Status: Closed * 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/