aboutsummaryrefslogtreecommitdiff
path: root/src/rpc/message.cpp
diff options
context:
space:
mode:
authorselsta <selsta@sent.at>2026-05-10 14:01:05 +0200
committerselsta <selsta@sent.at>2026-05-11 12:04:12 +0200
commita16f514c67e95cec4946dc83dbad04ed1baad023 (patch)
treefce83fb9e8b7a2a36abf82927755cb0f9a56305e /src/rpc/message.cpp
parent3ca4c30f73fe22d16a46cfba122556437da3618d (diff)
downloadmonzero-core-a16f514c67e95cec4946dc83dbad04ed1baad023.tar.gz
monzero-core-a16f514c67e95cec4946dc83dbad04ed1baad023.tar.xz
monzero-core-a16f514c67e95cec4946dc83dbad04ed1baad023.zip
rpc: reject invalid JSON-RPC ids in ZMQ requests
Diffstat (limited to 'src/rpc/message.cpp')
-rw-r--r--src/rpc/message.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/rpc/message.cpp b/src/rpc/message.cpp
index 005c40ea2..c7d79ef06 100644
--- a/src/rpc/message.cpp
+++ b/src/rpc/message.cpp
@@ -62,6 +62,17 @@ const rapidjson::Value& get_method_field(const rapidjson::Value& src)
}
}
+void validate_id_field(const rapidjson::Value& src)
+{
+ const auto member = src.FindMember(id_field);
+ if (member == src.MemberEnd())
+ return;
+
+ // If present, JSON-RPC 2.0 request ids must be String, Number, or Null.
+ if (!member->value.IsString() && !member->value.IsNumber() && !member->value.IsNull())
+ throw cryptonote::json::WRONG_TYPE{"Expected string, number or null"};
+}
+
void Message::toJson(rapidjson::Writer<epee::byte_stream>& dest) const
{
dest.StartObject();
@@ -92,6 +103,7 @@ FullMessage::FullMessage(std::string&& json_string, bool request)
{
get_method_field(doc); // throws on errors
OBJECT_HAS_MEMBER_OR_THROW(doc, params_field)
+ validate_id_field(doc);
}
else
{