]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: fix potential for-select spin with closed Context.Done channel
authorBrad Fitzpatrick <bradfitz@golang.org>
Fri, 22 Jul 2016 21:58:18 +0000 (21:58 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 22 Jul 2016 22:23:14 +0000 (22:23 +0000)
Noticed when investigating a separate issue.

No external bug report or repro yet.

Change-Id: I8a1641a43163f22b09accd3beb25dd9e2a68a238
Reviewed-on: https://go-review.googlesource.com/25152
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Andrew Gerrand <adg@golang.org>
src/net/http/transport.go

index 9164d0d827c0017af81673c450f009622681e3e3..a51f1d06580514a0fd991344bd58d55c076776d0 100644 (file)
@@ -1784,6 +1784,7 @@ func (pc *persistConn) roundTrip(req *transportRequest) (resp *Response, err err
        var re responseAndError
        var respHeaderTimer <-chan time.Time
        cancelChan := req.Request.Cancel
+       ctxDoneChan := req.Context().Done()
 WaitResponse:
        for {
                testHookWaitResLoop()
@@ -1815,9 +1816,11 @@ WaitResponse:
                case <-cancelChan:
                        pc.t.CancelRequest(req.Request)
                        cancelChan = nil
-               case <-req.Context().Done():
+                       ctxDoneChan = nil
+               case <-ctxDoneChan:
                        pc.t.CancelRequest(req.Request)
                        cancelChan = nil
+                       ctxDoneChan = nil
                }
        }