diff --git a/http2/frame.go b/http2/frame.go index a26039c1..be75badc 100644 --- a/http2/frame.go +++ b/http2/frame.go @@ -145,7 +145,9 @@ var frameParsers = [...]frameParser{ func typeFrameParser(t FrameType) frameParser { if int(t) < len(frameParsers) { - return frameParsers[t] + if f := frameParsers[t]; f != nil { + return f + } } return parseUnknownFrame } diff --git a/http2/frame_test.go b/http2/frame_test.go index 0e3d0189..287a65e3 100644 --- a/http2/frame_test.go +++ b/http2/frame_test.go @@ -1585,3 +1585,20 @@ func TestReadFrameForHeaderUnexpectedEOF(t *testing.T) { t.Fatalf("ReadFrameForHeader with short body = %v; want io.ErrUnexpectedEOF", err) } } + +func TestTypeFrameParserHolePanic(t *testing.T) { + // Verify that unassigned frame types (0x0a-0x0f) don't panic. golang.org/issue/77652 + fr, _ := testFramer() + if err := fr.WriteRawFrame(FrameType(0x0a), 0, 1, nil); err != nil { + t.Fatal(err) + } + + f, err := fr.ReadFrame() + if err != nil { + t.Fatal(err) + } + + if _, ok := f.(*UnknownFrame); !ok { + t.Errorf("got %T; want *UnknownFrame", f) + } +}