--- /dev/null
+//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)
+ })
+}
}
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 {
}
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
}