bencode/decode.go | 16 +++++++++++----- bencode/testdata/fuzz/FuzzInterfaceRoundTrip/321f4f280d23ac90ccaf7894a9106ad601e23fd484747898394a12bddba90615 | 2 ++ bencode/testdata/fuzz/FuzzInterfaceRoundTrip/808391fc9a93d89909205a5216675a7e1b7b8ef7b4e4d80ec7b7b5dce6dbbb38 | 2 ++ diff --git a/bencode/decode.go b/bencode/decode.go index 90397854bcd0bc1bdb7f66e79145fdad149dd81f..4552da1c340b4dacc28788ac4bc7c7971427b338 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -105,7 +105,7 @@ // Assume the 'i' is already consumed. Read and validate the rest of an int into the buffer. 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 @@ d.buf.Reset() 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 index 0000000000000000000000000000000000000000..92d01013ccae070a704f1c2dc5862cde61fe6388 --- /dev/null +++ b/bencode/testdata/fuzz/FuzzInterfaceRoundTrip/321f4f280d23ac90ccaf7894a9106ad601e23fd484747898394a12bddba90615 @@ -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 index 0000000000000000000000000000000000000000..ed2aa4688fb02d9f39ca4a70bef12eb998cda6ea --- /dev/null +++ b/bencode/testdata/fuzz/FuzzInterfaceRoundTrip/808391fc9a93d89909205a5216675a7e1b7b8ef7b4e4d80ec7b7b5dce6dbbb38 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("i-0e")