diff options
author | Robert Griesemer <gri@golang.org> | 2011-12-22 14:15:41 -0800 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2011-12-22 14:15:41 -0800 |
commit | fc78c5aa000a1b7c5a2e894ce1b511385b280ccd (patch) | |
tree | 519264ba27eaa56968610fe889e6e364bea0ec93 | |
parent | b6122b0a64449da93d1a2d457239ebb00fce6cbc (diff) | |
download | go-fc78c5aa000a1b7c5a2e894ce1b511385b280ccd.tar.gz go-fc78c5aa000a1b7c5a2e894ce1b511385b280ccd.zip |
math/big: Rand shouldn't hang if argument is also receiver.
Fixes #2607.
R=rsc
CC=golang-dev
https://golang.org/cl/5489109
-rw-r--r-- | src/pkg/math/big/int_test.go | 7 | ||||
-rw-r--r-- | src/pkg/math/big/nat.go | 6 |
2 files changed, 12 insertions, 1 deletions
diff --git a/src/pkg/math/big/int_test.go b/src/pkg/math/big/int_test.go index aa7c194954..9c4b730187 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 ead1a881a6..69681ae2d6 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 { |