Bug #14837
closedruby blocks due to unavoidable getrandom without GRND_NONBLOCK
Description
Following the instructions in the Rubygems FAQ I added the following to ~/.bashrc
:
if which ruby >/dev/null && which gem >/dev/null; then
PATH="$(ruby -e 'puts Gem.user_dir')/bin:$PATH"
fi
Unfortunately, this causes login to block for several seconds to minutes (depending on available entropy sources) because ruby -e 'puts Gem.user_dir'
makes two getrandom
syscalls without the GRND_NONBLOCK
flag. On Linux v4.17-rc2 and later, this causes ruby, and therefore the login process, to block until the RNG is fully initialized.
Arguably Rubygems could provide/recommend a way to get the user GEM dir without invoking Ruby. That would solve the specific login problem reported above. However, since even ruby -v
makes two getrandom
syscalls, I suspect this may cause difficult to diagnose hangs in startup or login scripts for many users and that it is a desirable use case to support, which is why I am reporting it here.
Some relevant history: r51182 added getrandom
, r51374 added GRND_NONBLOCK
to address Bug #11395 (similar to this issue), r52808 removed GRND_NONBLOCK
in some cases for SecureRandom
.
Thanks for considering,
Kevin