]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Add generalized decodeJsonByteString and a fuzz target for it
authorMatt Joiner <anacrolix@gmail.com>
Sat, 11 Dec 2021 02:43:25 +0000 (13:43 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 12 Dec 2021 05:56:01 +0000 (16:56 +1100)
webtorrent/fuzz_test.go [new file with mode: 0644]
webtorrent/testdata/fuzz/FuzzJsonBinaryStrings/195b11403204772a785dfc25a6f37ba920daf479f86bcfbbb880cd06cbb2ecf8 [new file with mode: 0644]
webtorrent/testdata/fuzz/FuzzJsonBinaryStrings/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4 [new file with mode: 0644]
webtorrent/testdata/fuzz/FuzzJsonBinaryStrings/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 [new file with mode: 0644]
webtorrent/tracker_protocol.go

diff --git a/webtorrent/fuzz_test.go b/webtorrent/fuzz_test.go
new file mode 100644 (file)
index 0000000..14638fa
--- /dev/null
@@ -0,0 +1,31 @@
+//go:build go1.18
+// +build go1.18
+
+package webtorrent
+
+import (
+       "encoding/json"
+       "testing"
+
+       qt "github.com/frankban/quicktest"
+)
+
+func FuzzJsonBinaryStrings(f *testing.F) {
+       f.Fuzz(func(t *testing.T, in []byte) {
+               jsonBytes, err := json.Marshal(binaryToJsonString(in))
+               if err != nil {
+                       t.Fatal(err)
+               }
+               // t.Logf("%q", jsonBytes)
+               var jsonStr string
+               err = json.Unmarshal(jsonBytes, &jsonStr)
+               if err != nil {
+                       t.Fatal(err)
+               }
+               // t.Logf("%q", jsonStr)
+               c := qt.New(t)
+               out, err := decodeJsonByteString(jsonStr, []byte{})
+               c.Assert(err, qt.IsNil)
+               c.Assert(out, qt.DeepEquals, in)
+       })
+}
diff --git a/webtorrent/testdata/fuzz/FuzzJsonBinaryStrings/195b11403204772a785dfc25a6f37ba920daf479f86bcfbbb880cd06cbb2ecf8 b/webtorrent/testdata/fuzz/FuzzJsonBinaryStrings/195b11403204772a785dfc25a6f37ba920daf479f86bcfbbb880cd06cbb2ecf8
new file mode 100644 (file)
index 0000000..9afa08b
--- /dev/null
@@ -0,0 +1,2 @@
+go test fuzz v1
+[]byte("\x93")
diff --git a/webtorrent/testdata/fuzz/FuzzJsonBinaryStrings/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4 b/webtorrent/testdata/fuzz/FuzzJsonBinaryStrings/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4
new file mode 100644 (file)
index 0000000..a96f559
--- /dev/null
@@ -0,0 +1,2 @@
+go test fuzz v1
+[]byte("0")
diff --git a/webtorrent/testdata/fuzz/FuzzJsonBinaryStrings/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 b/webtorrent/testdata/fuzz/FuzzJsonBinaryStrings/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9
new file mode 100644 (file)
index 0000000..67322c7
--- /dev/null
@@ -0,0 +1,2 @@
+go test fuzz v1
+[]byte("")
index b6ac1a5b835064b22bffb902df75632b97834047..14be67e452fee9386c91417e65f1a6680acfae34 100644 (file)
@@ -48,6 +48,17 @@ func binaryToJsonString(b []byte) string {
 }
 
 func jsonStringToInfoHash(s string) (ih [20]byte, err error) {
+       b, err := decodeJsonByteString(s, ih[:0])
+       if err != nil {
+               return
+       }
+       if len(b) != len(ih) {
+               err = fmt.Errorf("string decoded to %v bytes", len(b))
+       }
+       return
+}
+
+func decodeJsonByteString(s string, b []byte) ([]byte, error) {
        defer func() {
                r := recover()
                if r == nil {
@@ -55,12 +66,11 @@ func jsonStringToInfoHash(s string) (ih [20]byte, err error) {
                }
                panic(fmt.Sprintf("%q", s))
        }()
-       for i, c := range []rune(s) {
+       for _, c := range []rune(s) {
                if c < 0 || c > math.MaxUint8 {
-                       err = fmt.Errorf("bad infohash string: %v", s)
-                       return
+                       return b, fmt.Errorf("rune out of bounds: %v", c)
                }
-               ih[i] = byte(c)
+               b = append(b, byte(c))
        }
-       return
+       return b, nil
 }