Skip to content

Commit a424d47

Browse files
marten-seemannnmldiegues
authored andcommitted
avoid recursion when skipping unknown HTTP/3 frames (quic-go#3354)
1 parent 4ce7cea commit a424d47

File tree

1 file changed

+31
-30
lines changed

1 file changed

+31
-30
lines changed

http3/frames.go

+31-30
Original file line numberDiff line numberDiff line change
@@ -14,38 +14,39 @@ type frame interface{}
1414

1515
func parseNextFrame(r io.Reader) (frame, error) {
1616
qr := quicvarint.NewReader(r)
17-
t, err := quicvarint.Read(qr)
18-
if err != nil {
19-
return nil, err
20-
}
21-
l, err := quicvarint.Read(qr)
22-
if err != nil {
23-
return nil, err
24-
}
25-
26-
switch t {
27-
case 0x0:
28-
return &dataFrame{Length: l}, nil
29-
case 0x1:
30-
return &headersFrame{Length: l}, nil
31-
case 0x4:
32-
return parseSettingsFrame(r, l)
33-
case 0x3: // CANCEL_PUSH
34-
fallthrough
35-
case 0x5: // PUSH_PROMISE
36-
fallthrough
37-
case 0x7: // GOAWAY
38-
fallthrough
39-
case 0xd: // MAX_PUSH_ID
40-
fallthrough
41-
case 0xe: // DUPLICATE_PUSH
42-
fallthrough
43-
default:
44-
// skip over unknown frames
45-
if _, err := io.CopyN(ioutil.Discard, qr, int64(l)); err != nil {
17+
for {
18+
t, err := quicvarint.Read(qr)
19+
if err != nil {
4620
return nil, err
4721
}
48-
return parseNextFrame(qr)
22+
l, err := quicvarint.Read(qr)
23+
if err != nil {
24+
return nil, err
25+
}
26+
27+
switch t {
28+
case 0x0:
29+
return &dataFrame{Length: l}, nil
30+
case 0x1:
31+
return &headersFrame{Length: l}, nil
32+
case 0x4:
33+
return parseSettingsFrame(r, l)
34+
case 0x3: // CANCEL_PUSH
35+
fallthrough
36+
case 0x5: // PUSH_PROMISE
37+
fallthrough
38+
case 0x7: // GOAWAY
39+
fallthrough
40+
case 0xd: // MAX_PUSH_ID
41+
fallthrough
42+
case 0xe: // DUPLICATE_PUSH
43+
fallthrough
44+
default:
45+
// skip over unknown frames
46+
if _, err := io.CopyN(ioutil.Discard, qr, int64(l)); err != nil {
47+
return nil, err
48+
}
49+
}
4950
}
5051
}
5152

0 commit comments

Comments
 (0)