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]

Reply via email to