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