Skip to content

Commit 12ddef7

Browse files
committed
http2: reject DATA frames after 1xx and before final headers
When checking to see if a DATA frame can be accepted, check to see if we have received a non-1xx header, not whether we have received any header. Fixes golang/go#65927 Change-Id: Id4fae1862de6179f8fc95e02dec7d4c47a7640e1 Reviewed-on: https://go-review.googlesource.com/c/net/+/567175 Reviewed-by: Jonathan Amsterdam <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent d600ae0 commit 12ddef7

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

http2/transport.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2787,7 +2787,7 @@ func (rl *clientConnReadLoop) processData(f *DataFrame) error {
27872787
})
27882788
return nil
27892789
}
2790-
if !cs.firstByte {
2790+
if !cs.pastHeaders {
27912791
cc.logf("protocol error: received DATA before a HEADERS frame")
27922792
rl.endStreamError(cs, StreamError{
27932793
StreamID: f.StreamID,

http2/transport_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6254,3 +6254,32 @@ func TestDialRaceResumesDial(t *testing.T) {
62546254
case <-successCh:
62556255
}
62566256
}
6257+
6258+
func TestTransportDataAfter1xxHeader(t *testing.T) {
6259+
// Discard logger output to avoid spamming stderr.
6260+
log.SetOutput(io.Discard)
6261+
defer log.SetOutput(os.Stderr)
6262+
6263+
// https://go.dev/issue/65927 - server sends a 1xx response, followed by a DATA frame.
6264+
tc := newTestClientConn(t)
6265+
tc.greet()
6266+
6267+
req, _ := http.NewRequest("GET", "https://dummy.tld/", nil)
6268+
rt := tc.roundTrip(req)
6269+
6270+
tc.wantFrameType(FrameHeaders)
6271+
tc.writeHeaders(HeadersFrameParam{
6272+
StreamID: rt.streamID(),
6273+
EndHeaders: true,
6274+
EndStream: false,
6275+
BlockFragment: tc.makeHeaderBlockFragment(
6276+
":status", "100",
6277+
),
6278+
})
6279+
tc.writeData(rt.streamID(), true, []byte{0})
6280+
err := rt.err()
6281+
if err, ok := err.(StreamError); !ok || err.Code != ErrCodeProtocol {
6282+
t.Errorf("RoundTrip error: %v; want ErrCodeProtocol", err)
6283+
}
6284+
tc.wantFrameType(FrameRSTStream)
6285+
}

0 commit comments

Comments
 (0)