]> Cypherpunks repositories - gostls13.git/commitdiff
net: fix deadlock in lookupProtocol on Windows
authorSpike Curtis <spike@coder.com>
Thu, 17 Apr 2025 06:55:10 +0000 (06:55 +0000)
committerQuim Muntal <quimmuntal@gmail.com>
Mon, 12 May 2025 19:27:33 +0000 (12:27 -0700)
If the context expires before acquireThread(ctx) succeeds, then the goroutine can block like:

net.lookupProtocol.func1()
src/net/lookup_windows.go:58 +0x105
created by net.lookupProtocol in goroutine 2834
src/net/lookup_windows.go:56 +0xda

We saw this in our UTs with a leak detector, confirmed by inspection of the source code.

Change-Id: I9b927f0345a2fa7336b23d95c506a8a0976e28d0
GitHub-Last-Rev: 27af7477a99bdbee0c32697837f1ff261ee70d83
GitHub-Pull-Request: golang/go#73364
Reviewed-on: https://go-review.googlesource.com/c/go/+/664956
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Zxilly Chou <zhouxinyu1001@gmail.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/net/lookup_windows.go

index 7a8fda0a301feca2323e7cd37a4d6fec0550fbb2..38034dc6014c9309d9cde5500a5da84ebd6b0c23 100644 (file)
@@ -52,7 +52,7 @@ func lookupProtocol(ctx context.Context, name string) (int, error) {
                proto int
                err   error
        }
-       ch := make(chan result) // unbuffered
+       ch := make(chan result, 1) // buffer so that next goroutine never blocks
        go func() {
                if err := acquireThread(ctx); err != nil {
                        ch <- result{err: mapErr(err)}
@@ -62,10 +62,7 @@ func lookupProtocol(ctx context.Context, name string) (int, error) {
                runtime.LockOSThread()
                defer runtime.UnlockOSThread()
                proto, err := getprotobyname(name)
-               select {
-               case ch <- result{proto: proto, err: err}:
-               case <-ctx.Done():
-               }
+               ch <- result{proto: proto, err: err}
        }()
        select {
        case r := <-ch: