Skip to content

Commit 6249541

Browse files
neildgopherbot
authored andcommitted
http2: avoid race in server handler SetReadDeadine/SetWriteDeadline
Can't safely access responseWriter.rws from on the server's serve loop. Change-Id: I477abe58cf9dd23813a0c5507aed2319696fdfaf Reviewed-on: https://go-review.googlesource.com/c/net/+/589856 Reviewed-by: Brad Fitzpatrick <[email protected]> Reviewed-by: Matthew Dempsky <[email protected]> Auto-Submit: Damien Neil <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent 603e3e6 commit 6249541

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

Diff for: http2/server.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -2821,9 +2821,9 @@ func (w *responseWriter) SetReadDeadline(deadline time.Time) error {
28212821
if deadline.IsZero() {
28222822
st.readDeadline = nil
28232823
} else if st.readDeadline == nil {
2824-
st.readDeadline = sc.srv.afterFunc(deadline.Sub(w.rws.conn.srv.now()), st.onReadTimeout)
2824+
st.readDeadline = sc.srv.afterFunc(deadline.Sub(sc.srv.now()), st.onReadTimeout)
28252825
} else {
2826-
st.readDeadline.Reset(deadline.Sub(w.rws.conn.srv.now()))
2826+
st.readDeadline.Reset(deadline.Sub(sc.srv.now()))
28272827
}
28282828
})
28292829
return nil
@@ -2847,9 +2847,9 @@ func (w *responseWriter) SetWriteDeadline(deadline time.Time) error {
28472847
if deadline.IsZero() {
28482848
st.writeDeadline = nil
28492849
} else if st.writeDeadline == nil {
2850-
st.writeDeadline = sc.srv.afterFunc(deadline.Sub(w.rws.conn.srv.now()), st.onWriteTimeout)
2850+
st.writeDeadline = sc.srv.afterFunc(deadline.Sub(sc.srv.now()), st.onWriteTimeout)
28512851
} else {
2852-
st.writeDeadline.Reset(deadline.Sub(w.rws.conn.srv.now()))
2852+
st.writeDeadline.Reset(deadline.Sub(sc.srv.now()))
28532853
}
28542854
})
28552855
return nil

Diff for: http2/server_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -4661,3 +4661,16 @@ func TestServerRequestCancelOnError(t *testing.T) {
46614661
})
46624662
<-donec
46634663
}
4664+
4665+
func TestServerSetReadWriteDeadlineRace(t *testing.T) {
4666+
ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
4667+
ctl := http.NewResponseController(w)
4668+
ctl.SetReadDeadline(time.Now().Add(3600 * time.Second))
4669+
ctl.SetWriteDeadline(time.Now().Add(3600 * time.Second))
4670+
})
4671+
resp, err := ts.Client().Get(ts.URL)
4672+
if err != nil {
4673+
t.Fatal(err)
4674+
}
4675+
resp.Body.Close()
4676+
}

0 commit comments

Comments
 (0)