summaryrefslogtreecommitdiff
path: root/libgo/go/crypto/rand/rand_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/crypto/rand/rand_unix.go')
-rw-r--r--libgo/go/crypto/rand/rand_unix.go18
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.