From f316c947100f7683f4ca9ba1c71bb1446433dbb4 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Thu, 17 Mar 2016 23:28:28 +0900 Subject: Ignore floating number in torrent file --- src/BencodeParser.cc | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) (limited to 'src/BencodeParser.cc') diff --git a/src/BencodeParser.cc b/src/BencodeParser.cc index f5423072..08d36b21 100644 --- a/src/BencodeParser.cc +++ b/src/BencodeParser.cc @@ -55,7 +55,8 @@ enum { BENCODE_STRING_LEN, BENCODE_STRING, BENCODE_NUMBER_SIGN, - BENCODE_NUMBER + BENCODE_NUMBER, + BENCODE_FLOAT_NUMBER_IGNORE, }; } // namespace @@ -216,11 +217,32 @@ ssize_t BencodeParser::parseUpdate(const char* data, size_t size) } numConsumed_ += j - i; if (j != size) { - if (data[j] != 'e' || numConsumed_ == 0) { + if (numConsumed_ == 0) { currentState_ = BENCODE_ERROR; return lastError_ = ERR_INVALID_NUMBER; } + + auto c = data[j]; + if (util::isDigit(c) || c == '.' || c == 'E' || c == '+' || c == '-') { + // some torrent generator adds floating point number in + // scientific notation (e.g., -1.134E+3) in integer field. + // In this case, just skip these bytes until we find 'e'. + number_ = 0; + numConsumed_ = 0; + currentState_ = BENCODE_FLOAT_NUMBER_IGNORE; + + i = j; + + break; + } + + if (c != 'e') { + currentState_ = BENCODE_ERROR; + return lastError_ = ERR_INVALID_NUMBER; + } + i = j; + onNumberEnd(); } else { @@ -228,6 +250,20 @@ ssize_t BencodeParser::parseUpdate(const char* data, size_t size) } break; } + case BENCODE_FLOAT_NUMBER_IGNORE: { + auto c = data[i]; + if (util::isDigit(c) || c == '.' || c == 'E' || c == '+' || c == '-') { + continue; + } + + if (c != 'e') { + currentState_ = BENCODE_ERROR; + return lastError_ = ERR_INVALID_FLOAT_NUMBER; + } + + onNumberEnd(); + break; + } } } return i; -- cgit