This is an automated email from the ASF dual-hosted git repository.
wwbmmm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brpc.git
The following commit(s) were added to refs/heads/master by this push:
new d638a0cb Validate Discovery response object fields (#3533)
d638a0cb is described below
commit d638a0cbd2c3276cfde9108a0400d120789fb2b1
Author: Xiaofeng Wang <[email protected]>
AuthorDate: Wed Sep 9 20:28:03 2026 +0800
Validate Discovery response object fields (#3533)
Check JSON value types before looking up object members. Skip malformed node
and instance entries while rejecting malformed top-level service structures.
Include the service and instance index in validation logs.
---
src/brpc/policy/discovery_naming_service.cpp | 17 +++++++++++++++++
test/brpc_naming_service_unittest.cpp | 1 +
2 files changed, 18 insertions(+)
diff --git a/src/brpc/policy/discovery_naming_service.cpp
b/src/brpc/policy/discovery_naming_service.cpp
index 2dca269e..2ff163ea 100644
--- a/src/brpc/policy/discovery_naming_service.cpp
+++ b/src/brpc/policy/discovery_naming_service.cpp
@@ -89,6 +89,9 @@ static int ListDiscoveryNodes(const char* discovery_api_addr,
std::string* serve
}
for (BUTIL_RAPIDJSON_NAMESPACE::SizeType i = 0; i < data.Size(); ++i) {
const BUTIL_RAPIDJSON_NAMESPACE::Value& addr_item = data[i];
+ if (!addr_item.IsObject()) {
+ continue;
+ }
auto itr_addr = addr_item.FindMember("addr");
auto itr_status = addr_item.FindMember("status");
if (itr_addr == addr_item.MemberEnd() ||
@@ -385,12 +388,21 @@ int DiscoveryNamingService::GetServers(const char*
service_name,
return -1;
}
const BUTIL_RAPIDJSON_NAMESPACE::Value& data = itr_data->value;
+ if (!data.IsObject()) {
+ LOG(ERROR) << "data field for service " << service_name
+ << " is not a json object";
+ return -1;
+ }
auto itr_service = data.FindMember(service_name);
if (itr_service == data.MemberEnd()) {
LOG(ERROR) << "No " << service_name << " field in discovery response";
return -1;
}
const BUTIL_RAPIDJSON_NAMESPACE::Value& services = itr_service->value;
+ if (!services.IsObject()) {
+ LOG(ERROR) << "Service " << service_name << " is not a json object";
+ return -1;
+ }
auto itr_instances = services.FindMember("instances");
if (itr_instances == services.MemberEnd()) {
LOG(ERROR) << "Fail to find instances";
@@ -403,6 +415,11 @@ int DiscoveryNamingService::GetServers(const char*
service_name,
}
for (BUTIL_RAPIDJSON_NAMESPACE::SizeType i = 0; i < instances.Size(); ++i)
{
+ if (!instances[i].IsObject()) {
+ LOG(ERROR) << "instance[" << i << "] for service " << service_name
+ << " is not a json object";
+ continue;
+ }
std::string metadata;
// convert metadata in object to string
auto itr_metadata = instances[i].FindMember("metadata");
diff --git a/test/brpc_naming_service_unittest.cpp
b/test/brpc_naming_service_unittest.cpp
index 30c41923..570324fe 100644
--- a/test/brpc_naming_service_unittest.cpp
+++ b/test/brpc_naming_service_unittest.cpp
@@ -546,6 +546,7 @@ static std::string s_nodes_result = R"({
"message": "0",
"ttl": 1,
"data": [
+ 42,
{
"addr": "127.0.0.1:8635",
"status": 0,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]