From fc78c5aa000a1b7c5a2e894ce1b511385b280ccd Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 22 Dec 2011 14:15:41 -0800 Subject: [PATCH] math/big: Rand shouldn't hang if argument is also receiver. Fixes #2607. R=rsc CC=golang-dev https://golang.org/cl/5489109 --- src/pkg/math/big/int_test.go | 7 +++++++ src/pkg/math/big/nat.go | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/pkg/math/big/int_test.go b/src/pkg/math/big/int_test.go index aa7c1949549..9c4b7301874 100644 --- a/src/pkg/math/big/int_test.go +++ b/src/pkg/math/big/int_test.go @@ -9,6 +9,7 @@ import ( "encoding/gob" "encoding/hex" "fmt" + "math/rand" "testing" "testing/quick" ) @@ -1405,3 +1406,9 @@ func TestIntGobEncoding(t *testing.T) { } } } + +func TestIssue2607(t *testing.T) { + // This code sequence used to hang. + n := NewInt(10) + n.Rand(rand.New(rand.NewSource(9)), n) +} diff --git a/src/pkg/math/big/nat.go b/src/pkg/math/big/nat.go index ead1a881a6a..69681ae2d64 100644 --- a/src/pkg/math/big/nat.go +++ b/src/pkg/math/big/nat.go @@ -1196,12 +1196,16 @@ func (x nat) powersOfTwoDecompose() (q nat, k int) { // random creates a random integer in [0..limit), using the space in z if // possible. n is the bit length of limit. func (z nat) random(rand *rand.Rand, limit nat, n int) nat { + if alias(z, limit) { + z = nil // z is an alias for limit - cannot reuse + } + z = z.make(len(limit)) + bitLengthOfMSW := uint(n % _W) if bitLengthOfMSW == 0 { bitLengthOfMSW = _W } mask := Word((1 << bitLengthOfMSW) - 1) - z = z.make(len(limit)) for { for i := range z {