diff --git a/internal/wire/frame_parser_test.go b/internal/wire/frame_parser_test.go index 87f086d69..7aa0b435b 100644 --- a/internal/wire/frame_parser_test.go +++ b/internal/wire/frame_parser_test.go @@ -295,7 +295,7 @@ var _ = Describe("Frame parsing", func() { &ResetStreamFrame{}, &StopSendingFrame{}, &CryptoFrame{}, - &NewTokenFrame{}, + &NewTokenFrame{Token: []byte("lorem ipsum")}, &StreamFrame{Data: []byte("foobar")}, &MaxDataFrame{}, &MaxStreamDataFrame{}, diff --git a/internal/wire/new_token_frame.go b/internal/wire/new_token_frame.go index 2cf6fce5e..a79c38c56 100644 --- a/internal/wire/new_token_frame.go +++ b/internal/wire/new_token_frame.go @@ -2,6 +2,7 @@ package wire import ( "bytes" + "errors" "io" "github.com/lucas-clemente/quic-go/internal/protocol" @@ -24,6 +25,9 @@ func parseNewTokenFrame(r *bytes.Reader, _ protocol.VersionNumber) (*NewTokenFra if uint64(r.Len()) < tokenLen { return nil, io.EOF } + if tokenLen == 0 { + return nil, errors.New("Token must not be empty.") + } token := make([]byte, int(tokenLen)) if _, err := io.ReadFull(r, token); err != nil { return nil, err diff --git a/internal/wire/new_token_frame_test.go b/internal/wire/new_token_frame_test.go index 4c782256f..c23e0a08c 100644 --- a/internal/wire/new_token_frame_test.go +++ b/internal/wire/new_token_frame_test.go @@ -24,6 +24,14 @@ var _ = Describe("NEW_TOKEN frame", func() { Expect(b.Len()).To(BeZero()) }) + It("rejects empty tokens", func() { + data := []byte{0x7} + data = append(data, encodeVarInt(uint64(0))...) + b := bytes.NewReader(data) + _, err := parseNewTokenFrame(b, protocol.VersionWhatever) + Expect(err).To(MatchError("Token must not be empty.")) + }) + It("errors on EOFs", func() { token := "Lorem ipsum dolor sit amet, consectetur adipiscing elit" data := []byte{0x7}