diff options
author | Adam Langley <agl@golang.org> | 2012-09-22 05:55:05 +1000 |
---|---|---|
committer | Adam Langley <agl@golang.org> | 2012-09-22 05:55:05 +1000 |
commit | a02c8ee686afa4d7bbf048f8a6239d701df84a48 (patch) | |
tree | 1d1e322818647565702aa05d09ae75c018505c94 | |
parent | abbf03e9e7251142439043de3af365ac009af605 (diff) | |
download | go-a02c8ee686afa4d7bbf048f8a6239d701df84a48.tar.gz |
[release-branch.go1] crypto/rand: zero length reads shouldn't crash on Windows.
??? backport a69e30463bf4
crypto/rand: zero length reads shouldn't crash on Windows.
R=golang-dev, dave
CC=golang-dev
http://codereview.appspot.com/6496099
???
-rw-r--r-- | src/pkg/crypto/rand/rand_test.go | 11 | ||||
-rw-r--r-- | src/pkg/crypto/rand/rand_windows.go | 4 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/pkg/crypto/rand/rand_test.go b/src/pkg/crypto/rand/rand_test.go index be3a5a221..c5dbdb6cb 100644 --- a/src/pkg/crypto/rand/rand_test.go +++ b/src/pkg/crypto/rand/rand_test.go @@ -29,3 +29,14 @@ func TestRead(t *testing.T) { t.Fatalf("Compressed %d -> %d", len(b), z.Len()) } } + +func TestReadEmpty(t *testing.T) { + n, err := Reader.Read(make([]byte, 0)) + if n != 0 || err != nil { + t.Fatalf("Read(make([]byte, 0)) = %d, %v", n, err) + } + n, err = Reader.Read(nil) + if n != 0 || err != nil { + t.Fatalf("Read(make(nil) = %d, %v", n, err) + } +} diff --git a/src/pkg/crypto/rand/rand_windows.go b/src/pkg/crypto/rand/rand_windows.go index 2b2bd4bba..82b39b64a 100644 --- a/src/pkg/crypto/rand/rand_windows.go +++ b/src/pkg/crypto/rand/rand_windows.go @@ -35,6 +35,10 @@ func (r *rngReader) Read(b []byte) (n int, err error) { } } r.mu.Unlock() + + if len(b) == 0 { + return 0, nil + } err = syscall.CryptGenRandom(r.prov, uint32(len(b)), &b[0]) if err != nil { return 0, os.NewSyscallError("CryptGenRandom", err) |