diff --git a/parser.go b/parser.go index 8eeb450..c972aea 100644 --- a/parser.go +++ b/parser.go @@ -188,6 +188,9 @@ func (d *decoder) Decode(v *packet) error { if err != nil { return err } + if t < '0' || t > '0'+byte(BinaryAck) { + return fmt.Errorf("invalid packet type %q", t) + } v.Type = packetType(t - '0') if v.Type == BinaryEvent || v.Type == BinaryAck { diff --git a/parser_test.go b/parser_test.go index 2d6ac23..2aae731 100644 --- a/parser_test.go +++ b/parser_test.go @@ -28,6 +28,24 @@ func TestPacketType(t *testing.T) { }) } +func TestDecodeRejectsInvalidPacketType(t *testing.T) { + for _, input := range []string{"/", "7", "9[]"} { + t.Run(input, func(t *testing.T) { + saver := &FrameSaver{ + data: []FrameData{{ + Buffer: bytes.NewBufferString(input), + Type: engineio.MessageText, + }}, + } + + var p packet + if err := newDecoder(saver).Decode(&p); err == nil { + t.Fatalf("Decode(%q) error = nil, want invalid packet type error", input) + } + }) + } +} + func TestParser(t *testing.T) { p := packet{} var decodeData any