peer_protocol/decoder.go | 3 +-- peer_protocol/decoder_fuzz_test.go | 32 +++++++++++++++++++++++++++----- diff --git a/peer_protocol/decoder.go b/peer_protocol/decoder.go index 3b9d6e9cd3c378e5285d2b36bc8b0f0c57be62dd..870716c50e1098d6a2455325fe526e3e07b5ee4d 100644 --- a/peer_protocol/decoder.go +++ b/peer_protocol/decoder.go @@ -18,13 +18,12 @@ MaxLength Integer // TODO: Should this include the length header or not? } // io.EOF is returned if the source terminates cleanly on a message boundary. -// TODO: Is that before or after the message? func (d *Decoder) Decode(msg *Message) (err error) { var length Integer err = binary.Read(d.R, binary.BigEndian, &length) if err != nil { if err != io.EOF { - err = fmt.Errorf("error reading message length: %s", err) + err = fmt.Errorf("error reading message length: %w", err) } return } diff --git a/peer_protocol/decoder_fuzz_test.go b/peer_protocol/decoder_fuzz_test.go index 0fed779cc2f9629d3b42a5ab25bde5063602106d..2fd357e40f3e1c7ac1d7c8f701b5532f6c187c6f 100644 --- a/peer_protocol/decoder_fuzz_test.go +++ b/peer_protocol/decoder_fuzz_test.go @@ -3,7 +3,11 @@ import ( "bufio" "bytes" + "errors" + "io" "testing" + + qt "github.com/frankban/quicktest" ) func FuzzDecoder(f *testing.F) { @@ -11,13 +15,31 @@ f.Add([]byte("\x00\x00\x00\x00")) f.Add([]byte("\x00\x00\x00\x01\x00")) f.Add([]byte("\x00\x00\x00\x03\x14\x00")) f.Fuzz(func(t *testing.T, b []byte) { + c := qt.New(t) d := Decoder{ - R: bufio.NewReader(bytes.NewReader(b)), + R: bufio.NewReader(bytes.NewReader(b)), + MaxLength: 0x100, } - var m Message - err := d.Decode(&m) - if err != nil { - t.Skip(err) + var ms []Message + for { + var m Message + err := d.Decode(&m) + t.Log(err) + if errors.Is(err, io.EOF) { + break + } + if err == nil { + c.Assert(m, qt.Not(qt.Equals), Message{}) + ms = append(ms, m) + continue + } else { + t.Skip(err) + } } + var buf bytes.Buffer + for _, m := range ms { + buf.Write(m.MustMarshalBinary()) + } + c.Assert(buf.Bytes(), qt.DeepEquals, b) }) }