]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Improvements to decoder fuzzing
authorMatt Joiner <anacrolix@gmail.com>
Wed, 29 Sep 2021 23:42:54 +0000 (09:42 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 29 Sep 2021 23:42:54 +0000 (09:42 +1000)
peer_protocol/decoder.go
peer_protocol/decoder_fuzz_test.go

index 3b9d6e9cd3c378e5285d2b36bc8b0f0c57be62dd..870716c50e1098d6a2455325fe526e3e07b5ee4d 100644 (file)
@@ -18,13 +18,12 @@ type Decoder struct {
 }
 
 // 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
        }
index 0fed779cc2f9629d3b42a5ab25bde5063602106d..2fd357e40f3e1c7ac1d7c8f701b5532f6c187c6f 100644 (file)
@@ -3,7 +3,11 @@ package peer_protocol
 import (
        "bufio"
        "bytes"
+       "errors"
+       "io"
        "testing"
+
+       qt "github.com/frankban/quicktest"
 )
 
 func FuzzDecoder(f *testing.F) {
@@ -11,13 +15,31 @@ func FuzzDecoder(f *testing.F) {
        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 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 m Message
-               err := d.Decode(&m)
-               if err != nil {
-                       t.Skip(err)
+               var buf bytes.Buffer
+               for _, m := range ms {
+                       buf.Write(m.MustMarshalBinary())
                }
+               c.Assert(buf.Bytes(), qt.DeepEquals, b)
        })
 }