mirror of https://github.com/aria2/aria2
Ignore floating number in torrent file
parent
9b607bbae0
commit
f316c94710
|
@ -55,7 +55,8 @@ enum {
|
||||||
BENCODE_STRING_LEN,
|
BENCODE_STRING_LEN,
|
||||||
BENCODE_STRING,
|
BENCODE_STRING,
|
||||||
BENCODE_NUMBER_SIGN,
|
BENCODE_NUMBER_SIGN,
|
||||||
BENCODE_NUMBER
|
BENCODE_NUMBER,
|
||||||
|
BENCODE_FLOAT_NUMBER_IGNORE,
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
@ -216,11 +217,32 @@ ssize_t BencodeParser::parseUpdate(const char* data, size_t size)
|
||||||
}
|
}
|
||||||
numConsumed_ += j - i;
|
numConsumed_ += j - i;
|
||||||
if (j != size) {
|
if (j != size) {
|
||||||
if (data[j] != 'e' || numConsumed_ == 0) {
|
if (numConsumed_ == 0) {
|
||||||
currentState_ = BENCODE_ERROR;
|
currentState_ = BENCODE_ERROR;
|
||||||
return lastError_ = ERR_INVALID_NUMBER;
|
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;
|
i = j;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c != 'e') {
|
||||||
|
currentState_ = BENCODE_ERROR;
|
||||||
|
return lastError_ = ERR_INVALID_NUMBER;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = j;
|
||||||
|
|
||||||
onNumberEnd();
|
onNumberEnd();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -228,6 +250,20 @@ ssize_t BencodeParser::parseUpdate(const char* data, size_t size)
|
||||||
}
|
}
|
||||||
break;
|
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;
|
return i;
|
||||||
|
|
|
@ -52,7 +52,8 @@ enum BencodeError {
|
||||||
ERR_PREMATURE_DATA = -4,
|
ERR_PREMATURE_DATA = -4,
|
||||||
ERR_STRUCTURE_TOO_DEEP = -5,
|
ERR_STRUCTURE_TOO_DEEP = -5,
|
||||||
ERR_INVALID_STRING_LENGTH = -6,
|
ERR_INVALID_STRING_LENGTH = -6,
|
||||||
ERR_STRING_LENGTH_OUT_OF_RANGE = -7
|
ERR_STRING_LENGTH_OUT_OF_RANGE = -7,
|
||||||
|
ERR_INVALID_FLOAT_NUMBER = -8,
|
||||||
};
|
};
|
||||||
|
|
||||||
class BencodeParser {
|
class BencodeParser {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <cppunit/extensions/HelperMacros.h>
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
|
||||||
#include "ValueBase.h"
|
#include "ValueBase.h"
|
||||||
|
#include "BencodeParser.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -77,6 +78,12 @@ void ValueBaseBencodeParserTest::testParseUpdate()
|
||||||
CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775807LL,
|
CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775807LL,
|
||||||
downcast<Integer>(s)->i());
|
downcast<Integer>(s)->i());
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
// float number, ignored and always 0.
|
||||||
|
std::string src = "i+343243.342E-1333e";
|
||||||
|
auto s = parser.parseFinal(src.c_str(), src.size(), error);
|
||||||
|
CPPUNIT_ASSERT_EQUAL((int64_t)0, downcast<Integer>(s)->i());
|
||||||
|
}
|
||||||
{
|
{
|
||||||
// dict, size 1
|
// dict, size 1
|
||||||
std::string src = "d3:fooi123ee";
|
std::string src = "d3:fooi123ee";
|
||||||
|
@ -187,6 +194,11 @@ void ValueBaseBencodeParserTest::testParseUpdate()
|
||||||
checkDecodeError(std::string(51, 'l') + std::string(51, 'e'));
|
checkDecodeError(std::string(51, 'l') + std::string(51, 'e'));
|
||||||
checkDecodeError(std::string(50, 'l') + "d3:fooi100ee" +
|
checkDecodeError(std::string(50, 'l') + "d3:fooi100ee" +
|
||||||
std::string(50, 'e'));
|
std::string(50, 'e'));
|
||||||
|
// float number, but including bad characters
|
||||||
|
checkDecodeError("i-1.134a+33e");
|
||||||
|
checkDecodeError("ixe");
|
||||||
|
// empty number
|
||||||
|
checkDecodeError("ie");
|
||||||
{
|
{
|
||||||
// ignore trailing garbage at the end of the input.
|
// ignore trailing garbage at the end of the input.
|
||||||
std::string src = "5:aria2trail";
|
std::string src = "5:aria2trail";
|
||||||
|
|
Loading…
Reference in New Issue