mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
net: fix testHookCanceledDial race
Loading and calling testHookCanceledDial in the function passed to context.AfterFunc is racey, because the function runs in a separate goroutine, and is not synchronized with the test code that restores the original testHookCanceledDial value. We could add a channel and wait for the "AfterFunc" to return in the deferred function, but that's a lot of synchronization overhead just for a bit of test code. Instead we simply load testHookCanceledDial into a local variable synchronously. This fixes the race without introducing any overhead. Fixes #75474 Change-Id: If8fbd0f5f65375577c2ded64a13a15b406c45ecc Reviewed-on: https://go-review.googlesource.com/c/go/+/704455 Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org> Reviewed-by: Damien Neil <dneil@google.com> Auto-Submit: Damien Neil <dneil@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
parent
3203a5da29
commit
a58afe44fa
1 changed files with 3 additions and 0 deletions
|
|
@ -82,6 +82,9 @@ func (fd *netFD) connect(ctx context.Context, la, ra syscall.Sockaddr) (rsa sysc
|
|||
defer fd.pfd.SetWriteDeadline(noDeadline)
|
||||
}
|
||||
|
||||
// Load the hook function synchronously to prevent a race
|
||||
// with test code that restores the old value.
|
||||
testHookCanceledDial := testHookCanceledDial
|
||||
stop := context.AfterFunc(ctx, func() {
|
||||
// Force the runtime's poller to immediately give up
|
||||
// waiting for writability, unblocking waitWrite
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue