1
0
mirror of https://github.com/golang/go synced 2024-11-17 11:04:53 -07:00

crypto/rand: convert r.used to atomic type

For #53821

Change-Id: I1b5c62288eca20ff50f6d8d979cf82df24d4545b
GitHub-Last-Rev: 266148570a
GitHub-Pull-Request: golang/go#54884
Reviewed-on: https://go-review.googlesource.com/c/go/+/428477
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
cui fliter 2022-09-06 13:17:25 +00:00 committed by Daniel Martí
parent ef1c70fbde
commit 5f566d35bf

View File

@ -34,7 +34,7 @@ func init() {
type reader struct {
f io.Reader
mu sync.Mutex
used uint32 // Atomic: 0 - never used, 1 - used, but f == nil, 2 - used, and f != nil
used atomic.Uint32 // Atomic: 0 - never used, 1 - used, but f == nil, 2 - used, and f != nil
}
// altGetRandom if non-nil specifies an OS-specific function to get
@ -47,7 +47,7 @@ func warnBlocked() {
func (r *reader) Read(b []byte) (n int, err error) {
boring.Unreachable()
if atomic.CompareAndSwapUint32(&r.used, 0, 1) {
if r.used.CompareAndSwap(0, 1) {
// First use of randomness. Start timer to warn about
// being blocked on entropy not being available.
t := time.AfterFunc(time.Minute, warnBlocked)
@ -56,16 +56,16 @@ func (r *reader) Read(b []byte) (n int, err error) {
if altGetRandom != nil && altGetRandom(b) == nil {
return len(b), nil
}
if atomic.LoadUint32(&r.used) != 2 {
if r.used.Load() != 2 {
r.mu.Lock()
if atomic.LoadUint32(&r.used) != 2 {
if r.used.Load() != 2 {
f, err := os.Open(urandomDevice)
if err != nil {
r.mu.Unlock()
return 0, err
}
r.f = hideAgainReader{f}
atomic.StoreUint32(&r.used, 2)
r.used.Store(2)
}
r.mu.Unlock()
}