summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Langley <agl@golang.org>2012-09-22 05:55:05 +1000
committerAdam Langley <agl@golang.org>2012-09-22 05:55:05 +1000
commita02c8ee686afa4d7bbf048f8a6239d701df84a48 (patch)
tree1d1e322818647565702aa05d09ae75c018505c94
parentabbf03e9e7251142439043de3af365ac009af605 (diff)
downloadgo-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.go11
-rw-r--r--src/pkg/crypto/rand/rand_windows.go4
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)