From: Brad Fitzpatrick Date: Fri, 22 Jul 2016 21:58:18 +0000 (+0000) Subject: net/http: fix potential for-select spin with closed Context.Done channel X-Git-Tag: go1.7rc4~1^2~15 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=10538a8f9e2e718a47633ac5a6e90415a2c3f5f1;p=gostls13.git net/http: fix potential for-select spin with closed Context.Done channel 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 Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Andrew Gerrand --- diff --git a/src/net/http/transport.go b/src/net/http/transport.go index 9164d0d827..a51f1d0658 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -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 } }