Package: golang-github-hashicorp-go-sockaddr / 0.0~git20170627.41949a1+ds-2

01-Avoid-consul-dependency.patch Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Description: Avoid consul dependency
 Embed the SeedMathRand function, to avoid creating a circular dependency with
 consul. Taken from https://github.com/hashicorp/consul/blob/master/lib/rand.go
 Same author and copyright as the rest of the code.
--- a/sockaddrs_test.go
+++ b/sockaddrs_test.go
@@ -1,16 +1,44 @@
 package sockaddr_test
 
 import (
+	crand "crypto/rand"
 	"fmt"
+	"math"
+	"math/big"
 	"math/rand"
+	"sync"
+	"time"
 	"testing"
 
-	"github.com/hashicorp/consul/lib"
 	"github.com/hashicorp/go-sockaddr"
 )
 
 func init() {
-	lib.SeedMathRand()
+	SeedMathRand()
+}
+
+var (
+	once sync.Once
+
+	// SeededSecurely is set to true if a cryptographically secure seed
+	// was used to initialize rand.  When false, the start time is used
+	// as a seed.
+	SeededSecurely bool
+)
+
+// SeedMathRand provides weak, but guaranteed seeding, which is better than
+// running with Go's default seed of 1.  A call to SeedMathRand() is expected
+// to be called via init(), but never a second time.
+func SeedMathRand() {
+	once.Do(func() {
+		n, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
+		if err != nil {
+			rand.Seed(time.Now().UTC().UnixNano())
+			return
+		}
+		rand.Seed(n.Int64())
+		SeededSecurely = true
+	})
 }
 
 // NOTE: A number of these code paths are exercised in template/ and