]> Sergey Matveev's repositories - btrtrc.git/commitdiff
bencode: Fix decoding integer with leading +
authorMatt Joiner <anacrolix@gmail.com>
Fri, 10 Dec 2021 03:29:35 +0000 (14:29 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 12 Dec 2021 05:56:01 +0000 (16:56 +1100)
bencode/decode.go
bencode/testdata/fuzz/FuzzInterfaceRoundTrip/321f4f280d23ac90ccaf7894a9106ad601e23fd484747898394a12bddba90615 [new file with mode: 0644]
bencode/testdata/fuzz/FuzzInterfaceRoundTrip/808391fc9a93d89909205a5216675a7e1b7b8ef7b4e4d80ec7b7b5dce6dbbb38 [new file with mode: 0644]

index 90397854bcd0bc1bdb7f66e79145fdad149dd81f..4552da1c340b4dacc28788ac4bc7c7971427b338 100644 (file)
@@ -105,7 +105,7 @@ func (d *Decoder) throwSyntaxError(offset int64, err error) {
 func (d *Decoder) readInt() error {
        // start := d.Offset - 1
        d.readUntil('e')
-       if err := d.bufLeadingZero(); err != nil {
+       if err := d.checkBufferedInt(); err != nil {
                return err
        }
        // if d.buf.Len() == 0 {
@@ -161,10 +161,16 @@ func (d *Decoder) parseInt(v reflect.Value) error {
        return nil
 }
 
-func (d *Decoder) bufLeadingZero() error {
+func (d *Decoder) checkBufferedInt() error {
        b := d.buf.Bytes()
-       if len(b) > 1 && b[0] == '0' {
-               return fmt.Errorf("non-zero integer has leading zeroes: %q", b)
+       if len(b) <= 1 {
+               return nil
+       }
+       if b[0] == '-' {
+               b = b[1:]
+       }
+       if b[0] < '1' || b[0] > '9' {
+               return errors.New("invalid leading digit")
        }
        return nil
 }
@@ -173,7 +179,7 @@ func (d *Decoder) parseStringLength() (uint64, error) {
        // We should have already consumed the first byte of the length into the Decoder buf.
        start := d.Offset - 1
        d.readUntil(':')
-       if err := d.bufLeadingZero(); err != nil {
+       if err := d.checkBufferedInt(); err != nil {
                return 0, err
        }
        length, err := strconv.ParseUint(bytesAsString(d.buf.Bytes()), 10, 32)
diff --git a/bencode/testdata/fuzz/FuzzInterfaceRoundTrip/321f4f280d23ac90ccaf7894a9106ad601e23fd484747898394a12bddba90615 b/bencode/testdata/fuzz/FuzzInterfaceRoundTrip/321f4f280d23ac90ccaf7894a9106ad601e23fd484747898394a12bddba90615
new file mode 100644 (file)
index 0000000..92d0101
--- /dev/null
@@ -0,0 +1,2 @@
+go test fuzz v1
+[]byte("i+0e")
diff --git a/bencode/testdata/fuzz/FuzzInterfaceRoundTrip/808391fc9a93d89909205a5216675a7e1b7b8ef7b4e4d80ec7b7b5dce6dbbb38 b/bencode/testdata/fuzz/FuzzInterfaceRoundTrip/808391fc9a93d89909205a5216675a7e1b7b8ef7b4e4d80ec7b7b5dce6dbbb38
new file mode 100644 (file)
index 0000000..ed2aa46
--- /dev/null
@@ -0,0 +1,2 @@
+go test fuzz v1
+[]byte("i-0e")