Skip to content

Commit 19f580f

Browse files
knyk-devgopherbot
authored andcommitted
http2: fix nil panic in typeFrameParser for unassigned frame types
The addition of FramePriorityUpdate (0x10) in RFC 9218 introduced a gap in the frameParsers array indices (0x0a-0x0f). These indices were initialized to nil, causing a panic when typeFrameParser accessed them for unassigned frame types (e.g., ALTSVC 0x0a). This change adds a nil check in typeFrameParser to safely fallback to parseUnknownFrame for these unassigned types, preventing the crash. Fixes golang/go#77652 Change-Id: I14d7ad85afc1eafabc46417a9fff10f9e0a22446 Reviewed-on: https://go-review.googlesource.com/c/net/+/746180 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Damien Neil <dneil@google.com> Auto-Submit: Damien Neil <dneil@google.com> Reviewed-by: Mark Freeman <markfreeman@google.com>
1 parent 818aad7 commit 19f580f

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

http2/frame.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,9 @@ var frameParsers = [...]frameParser{
145145

146146
func typeFrameParser(t FrameType) frameParser {
147147
if int(t) < len(frameParsers) {
148-
return frameParsers[t]
148+
if f := frameParsers[t]; f != nil {
149+
return f
150+
}
149151
}
150152
return parseUnknownFrame
151153
}

http2/frame_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,3 +1585,20 @@ func TestReadFrameForHeaderUnexpectedEOF(t *testing.T) {
15851585
t.Fatalf("ReadFrameForHeader with short body = %v; want io.ErrUnexpectedEOF", err)
15861586
}
15871587
}
1588+
1589+
func TestTypeFrameParserHolePanic(t *testing.T) {
1590+
// Verify that unassigned frame types (0x0a-0x0f) don't panic. golang.org/issue/77652
1591+
fr, _ := testFramer()
1592+
if err := fr.WriteRawFrame(FrameType(0x0a), 0, 1, nil); err != nil {
1593+
t.Fatal(err)
1594+
}
1595+
1596+
f, err := fr.ReadFrame()
1597+
if err != nil {
1598+
t.Fatal(err)
1599+
}
1600+
1601+
if _, ok := f.(*UnknownFrame); !ok {
1602+
t.Errorf("got %T; want *UnknownFrame", f)
1603+
}
1604+
}

0 commit comments

Comments
 (0)