diff --git a/src/rpc/xmlrpc_tinyxml2.cc b/src/rpc/xmlrpc_tinyxml2.cc index 573b3653..0ec2c540 100644 --- a/src/rpc/xmlrpc_tinyxml2.cc +++ b/src/rpc/xmlrpc_tinyxml2.cc @@ -115,7 +115,12 @@ xml_value_to_object(const tinyxml2::XMLNode* elem) { } return torrent::Object(value_element_child->ToText()->Value()); } else if (value_element_type == "i4" || value_element_type == "i8" || value_element_type == "int") { - return torrent::Object(std::stol(std::string(value_element->FirstChild()->ToText()->Value()))); + char* pos; + auto str = value_element->FirstChild()->ToText()->Value(); + auto result = std::strtoll(str, &pos, 10); + if (pos == str || *pos != '\0') + throw xmlrpc_error(XMLRPC_TYPE_ERROR, "unable to parse integer value"); + return torrent::Object(result); } else if (value_element_type == "boolean") { auto boolean_text = std::string(value_element->FirstChild()->ToText()->Value()); if (boolean_text == "1") { diff --git a/test/rpc/xmlrpc_test_data.txt b/test/rpc/xmlrpc_test_data.txt index 8d612621..78f83a92 100644 --- a/test/rpc/xmlrpc_test_data.txt +++ b/test/rpc/xmlrpc_test_data.txt @@ -53,3 +53,7 @@ # Invalid - broken XML thodCall>test_a41faultCode-503faultStringError=XML_ERROR_PARSING_ELEMENT ErrorID=6 (0x6) Line number=1: XMLElement name=method + +# Invalid - non-integer i4 +xmlrpc_reflectstring value +faultCode-501faultStringunable to parse integer value