diff options
Diffstat (limited to 'libgo/go/crypto/rand/rand_unix.go')
-rw-r--r-- | libgo/go/crypto/rand/rand_unix.go | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/libgo/go/crypto/rand/rand_unix.go b/libgo/go/crypto/rand/rand_unix.go index 62d0fbdb350..75c36e05b34 100644 --- a/libgo/go/crypto/rand/rand_unix.go +++ b/libgo/go/crypto/rand/rand_unix.go @@ -58,12 +58,28 @@ func (r *devReader) Read(b []byte) (n int, err error) { if runtime.GOOS == "plan9" { r.f = f } else { - r.f = bufio.NewReader(f) + r.f = bufio.NewReader(hideAgainReader{f}) } } return r.f.Read(b) } +var isEAGAIN func(error) bool // set by eagain.go on unix systems + +// hideAgainReader masks EAGAIN reads from /dev/urandom. +// See golang.org/issue/9205 +type hideAgainReader struct { + r io.Reader +} + +func (hr hideAgainReader) Read(p []byte) (n int, err error) { + n, err = hr.r.Read(p) + if err != nil && isEAGAIN != nil && isEAGAIN(err) { + err = nil + } + return +} + // Alternate pseudo-random implementation for use on // systems without a reliable /dev/urandom. |