lib/securerandom.rb: test one byte to determine urandom or openssl

`SecureRandom#gen_random` determines whether urandom is available or not
by trying `Random.urandom(n)`.  But, when n = 0, `Random.urandom(0)`
always succeeds even if urandom is not available, which leads to a wrong
decision.

When failed, `Random.urandom` returns nil instead of returning a shorter
string than required.  So the check for `ret.length != n` is not needed.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59840 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mame 2017-09-11 12:44:51 +00:00
parent bfa3d672d1
commit 3b08df649e

View File

@ -52,7 +52,7 @@ module SecureRandom
end
def gen_random(n)
ret = Random.urandom(n)
ret = Random.urandom(1)
if ret.nil?
begin
require 'openssl'
@ -67,10 +67,6 @@ module SecureRandom
end
return gen_random(n)
end
elsif ret.length != n
raise NotImplementedError, \
"Unexpected partial read from random device: " \
"only #{ret.length} for #{n} bytes"
else
@rng_chooser.synchronize do
class << self