Fix race condition in random.go

This commit is contained in:
Jae Kwon 2018-03-18 01:50:15 +01:00
parent 9b9a9e7f8c
commit 3412587036
1 changed files with 12 additions and 12 deletions

View File

@ -165,7 +165,7 @@ MAIN_LOOP:
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
func (r *Rand) Uint16() uint16 { func (r *Rand) Uint16() uint16 {
return uint16(r.rand.Uint32() & (1<<16 - 1)) return uint16(r.Uint32() & (1<<16 - 1))
} }
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
@ -178,7 +178,7 @@ func (r *Rand) Uint32() uint32 {
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
func (r *Rand) Uint64() uint64 { func (r *Rand) Uint64() uint64 {
return uint64(r.rand.Uint32())<<32 + uint64(r.rand.Uint32()) return uint64(r.Uint32())<<32 + uint64(r.Uint32())
} }
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
@ -191,17 +191,17 @@ func (r *Rand) Uint() uint {
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
func (r *Rand) Int16() int16 { func (r *Rand) Int16() int16 {
return int16(r.rand.Uint32() & (1<<16 - 1)) return int16(r.Uint32() & (1<<16 - 1))
} }
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
func (r *Rand) Int32() int32 { func (r *Rand) Int32() int32 {
return int32(r.rand.Uint32()) return int32(r.Uint32())
} }
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
func (r *Rand) Int64() int64 { func (r *Rand) Int64() int64 {
return int64(r.rand.Uint64()) return int64(r.Uint64())
} }
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
@ -231,36 +231,36 @@ func (r *Rand) Int63() int64 {
// Distributed pseudo-exponentially to test for various cases // Distributed pseudo-exponentially to test for various cases
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
func (r *Rand) Uint16Exp() uint16 { func (r *Rand) Uint16Exp() uint16 {
bits := r.rand.Uint32() % 16 bits := r.Uint32() % 16
if bits == 0 { if bits == 0 {
return 0 return 0
} }
n := uint16(1 << (bits - 1)) n := uint16(1 << (bits - 1))
n += uint16(r.rand.Int31()) & ((1 << (bits - 1)) - 1) n += uint16(r.Int31()) & ((1 << (bits - 1)) - 1)
return n return n
} }
// Distributed pseudo-exponentially to test for various cases // Distributed pseudo-exponentially to test for various cases
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
func (r *Rand) Uint32Exp() uint32 { func (r *Rand) Uint32Exp() uint32 {
bits := r.rand.Uint32() % 32 bits := r.Uint32() % 32
if bits == 0 { if bits == 0 {
return 0 return 0
} }
n := uint32(1 << (bits - 1)) n := uint32(1 << (bits - 1))
n += uint32(r.rand.Int31()) & ((1 << (bits - 1)) - 1) n += uint32(r.Int31()) & ((1 << (bits - 1)) - 1)
return n return n
} }
// Distributed pseudo-exponentially to test for various cases // Distributed pseudo-exponentially to test for various cases
// It is not safe for cryptographic usage. // It is not safe for cryptographic usage.
func (r *Rand) Uint64Exp() uint64 { func (r *Rand) Uint64Exp() uint64 {
bits := r.rand.Uint32() % 64 bits := r.Uint32() % 64
if bits == 0 { if bits == 0 {
return 0 return 0
} }
n := uint64(1 << (bits - 1)) n := uint64(1 << (bits - 1))
n += uint64(r.rand.Int63()) & ((1 << (bits - 1)) - 1) n += uint64(r.Int63()) & ((1 << (bits - 1)) - 1)
return n return n
} }
@ -284,7 +284,7 @@ func (r *Rand) Bytes(n int) []byte {
// use random bytes generated from the internal PRNG // use random bytes generated from the internal PRNG
bs := make([]byte, n) bs := make([]byte, n)
for i := 0; i < len(bs); i++ { for i := 0; i < len(bs); i++ {
bs[i] = byte(r.rand.Int() & 0xFF) bs[i] = byte(r.Int() & 0xFF)
} }
return bs return bs
} }