]> Cypherpunks repositories - gostls13.git/commitdiff
math/big: Rand shouldn't hang if argument is also receiver.
authorRobert Griesemer <gri@golang.org>
Thu, 22 Dec 2011 22:15:41 +0000 (14:15 -0800)
committerRobert Griesemer <gri@golang.org>
Thu, 22 Dec 2011 22:15:41 +0000 (14:15 -0800)
Fixes #2607.

R=rsc
CC=golang-dev
https://golang.org/cl/5489109

src/pkg/math/big/int_test.go
src/pkg/math/big/nat.go

index aa7c19495494fff3778d2d5d326eb789ba8a9371..9c4b730187404fd25278ac3128d68fe19ae494d4 100644 (file)
@@ -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)
+}
index ead1a881a6a957d000d764062875b72d2923492a..69681ae2d640b825ba3b1bcbf3be370efea7b38f 100644 (file)
@@ -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 {