aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2011-12-22 14:15:41 -0800
committerRobert Griesemer <gri@golang.org>2011-12-22 14:15:41 -0800
commitfc78c5aa000a1b7c5a2e894ce1b511385b280ccd (patch)
tree519264ba27eaa56968610fe889e6e364bea0ec93
parentb6122b0a64449da93d1a2d457239ebb00fce6cbc (diff)
downloadgo-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.go7
-rw-r--r--src/pkg/math/big/nat.go6
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 {