diff --git a/src/parsers/integer.rs b/src/parsers/integer.rs index f49bb98..74afa5a 100644 --- a/src/parsers/integer.rs +++ b/src/parsers/integer.rs @@ -44,10 +44,15 @@ pub fn parse( ExpectingState::DigitOrSign => { if char.is_ascii_digit() { writer.write_byte(byte)?; - first_digit_is_zero = true; + + if char == '0' { + first_digit_is_zero = true; + } + ExpectingState::DigitOrEnd } else if char == '-' { writer.write_byte(byte)?; + ExpectingState::DigitAfterSign } else { return Err(Error::UnexpectedByteParsingInteger(byte, byte as char)); @@ -56,6 +61,11 @@ pub fn parse( ExpectingState::DigitAfterSign => { if char.is_ascii_digit() { writer.write_byte(byte)?; + + if char == '0' { + first_digit_is_zero = true; + } + ExpectingState::DigitOrEnd } else { return Err(Error::UnexpectedByteParsingInteger(byte, byte as char)); @@ -63,11 +73,12 @@ pub fn parse( } ExpectingState::DigitOrEnd => { if char.is_ascii_digit() { + writer.write_byte(byte)?; + if char == '0' && first_digit_is_zero { return Err(Error::LeadingZerosInIntegersNotAllowed); } - writer.write_byte(byte)?; ExpectingState::DigitOrEnd } else if byte == BENCODE_END_INTEGER { return Ok(()); @@ -178,4 +189,18 @@ mod tests { Err(Error::LeadingZerosInIntegersNotAllowed) )); } + + #[test] + fn it_should_fail_when_it_finds_leading_zeros_in_a_negative_integer() { + // Leading zeros are not allowed.Only the zero integer can start with zero. + + let int_with_invalid_byte = b"i-00e"; + + let result = try_bencode_to_json(int_with_invalid_byte); + + assert!(matches!( + result, + Err(Error::LeadingZerosInIntegersNotAllowed) + )); + } }