fix use-after-free bug

pull/22147/head
Mark D. Roth 5 years ago
parent def07a4716
commit 67a2eb2ba1
  1. 68
      src/core/ext/filters/client_channel/xds/xds_api.cc
  2. 3
      src/core/ext/filters/client_channel/xds/xds_api.h
  3. 12
      src/proto/grpc/testing/xds/eds_for_test.proto

@ -127,6 +127,8 @@ const char* XdsApi::kEdsTypeUrl =
XdsApi::XdsApi(const XdsBootstrap::Node* node)
: node_(node),
build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ",
grpc_version_string())),
user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING)) {}
namespace {
@ -191,6 +193,7 @@ void PopulateMetadataValue(upb_arena* arena, google_protobuf_Value* value_pb,
}
void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node,
const std::string& build_version,
const std::string& user_agent_name,
const std::string& server_name,
envoy_api_v2_core_Node* node_msg) {
@ -238,8 +241,6 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node,
}
}
}
std::string build_version =
absl::StrCat(user_agent_name, " ", grpc_version_string());
envoy_api_v2_core_Node_set_build_version(
node_msg, upb_strview_make(build_version.data(), build_version.size()));
envoy_api_v2_core_Node_set_user_agent_name(
@ -254,8 +255,7 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node,
envoy_api_v2_DiscoveryRequest* CreateDiscoveryRequest(
upb_arena* arena, const char* type_url, const std::string& version,
const std::string& nonce, grpc_error* error, const XdsBootstrap::Node* node,
const std::string& user_agent_name) {
const std::string& nonce, grpc_error* error) {
// Create a request.
envoy_api_v2_DiscoveryRequest* request =
envoy_api_v2_DiscoveryRequest_new(arena);
@ -286,12 +286,6 @@ envoy_api_v2_DiscoveryRequest* CreateDiscoveryRequest(
google_rpc_Status_set_message(error_detail, error_description_strview);
GRPC_ERROR_UNREF(error);
}
// Populate node.
if (!user_agent_name.empty()) {
envoy_api_v2_core_Node* node_msg =
envoy_api_v2_DiscoveryRequest_mutable_node(request, arena);
PopulateNode(arena, node, user_agent_name, "", node_msg);
}
return request;
}
@ -310,8 +304,7 @@ grpc_slice XdsApi::CreateUnsupportedTypeNackRequest(const std::string& type_url,
grpc_error* error) {
upb::Arena arena;
envoy_api_v2_DiscoveryRequest* request = CreateDiscoveryRequest(
arena.ptr(), type_url.c_str(), /*version=*/"", nonce, error,
/*node=*/nullptr, /*user_agent_name=*/"");
arena.ptr(), type_url.c_str(), /*version=*/"", nonce, error);
return SerializeDiscoveryRequest(arena.ptr(), request);
}
@ -320,9 +313,15 @@ grpc_slice XdsApi::CreateLdsRequest(const std::string& server_name,
const std::string& nonce, grpc_error* error,
bool populate_node) {
upb::Arena arena;
envoy_api_v2_DiscoveryRequest* request = CreateDiscoveryRequest(
arena.ptr(), kLdsTypeUrl, version, nonce, error,
populate_node ? node_ : nullptr, populate_node ? user_agent_name_ : "");
envoy_api_v2_DiscoveryRequest* request =
CreateDiscoveryRequest(arena.ptr(), kLdsTypeUrl, version, nonce, error);
// Populate node.
if (populate_node) {
envoy_api_v2_core_Node* node_msg =
envoy_api_v2_DiscoveryRequest_mutable_node(request, arena.ptr());
PopulateNode(arena.ptr(), node_, build_version_, user_agent_name_, "",
node_msg);
}
// Add resource_name.
envoy_api_v2_DiscoveryRequest_add_resource_names(
request, upb_strview_make(server_name.data(), server_name.size()),
@ -335,9 +334,15 @@ grpc_slice XdsApi::CreateRdsRequest(const std::string& route_config_name,
const std::string& nonce, grpc_error* error,
bool populate_node) {
upb::Arena arena;
envoy_api_v2_DiscoveryRequest* request = CreateDiscoveryRequest(
arena.ptr(), kRdsTypeUrl, version, nonce, error,
populate_node ? node_ : nullptr, populate_node ? user_agent_name_ : "");
envoy_api_v2_DiscoveryRequest* request =
CreateDiscoveryRequest(arena.ptr(), kRdsTypeUrl, version, nonce, error);
// Populate node.
if (populate_node) {
envoy_api_v2_core_Node* node_msg =
envoy_api_v2_DiscoveryRequest_mutable_node(request, arena.ptr());
PopulateNode(arena.ptr(), node_, build_version_, user_agent_name_, "",
node_msg);
}
// Add resource_name.
envoy_api_v2_DiscoveryRequest_add_resource_names(
request,
@ -351,9 +356,15 @@ grpc_slice XdsApi::CreateCdsRequest(const std::set<StringView>& cluster_names,
const std::string& nonce, grpc_error* error,
bool populate_node) {
upb::Arena arena;
envoy_api_v2_DiscoveryRequest* request = CreateDiscoveryRequest(
arena.ptr(), kCdsTypeUrl, version, nonce, error,
populate_node ? node_ : nullptr, populate_node ? user_agent_name_ : "");
envoy_api_v2_DiscoveryRequest* request =
CreateDiscoveryRequest(arena.ptr(), kCdsTypeUrl, version, nonce, error);
// Populate node.
if (populate_node) {
envoy_api_v2_core_Node* node_msg =
envoy_api_v2_DiscoveryRequest_mutable_node(request, arena.ptr());
PopulateNode(arena.ptr(), node_, build_version_, user_agent_name_, "",
node_msg);
}
// Add resource_names.
for (const auto& cluster_name : cluster_names) {
envoy_api_v2_DiscoveryRequest_add_resource_names(
@ -367,9 +378,15 @@ grpc_slice XdsApi::CreateEdsRequest(
const std::set<StringView>& eds_service_names, const std::string& version,
const std::string& nonce, grpc_error* error, bool populate_node) {
upb::Arena arena;
envoy_api_v2_DiscoveryRequest* request = CreateDiscoveryRequest(
arena.ptr(), kEdsTypeUrl, version, nonce, error,
populate_node ? node_ : nullptr, populate_node ? user_agent_name_ : "");
envoy_api_v2_DiscoveryRequest* request =
CreateDiscoveryRequest(arena.ptr(), kEdsTypeUrl, version, nonce, error);
// Populate node.
if (populate_node) {
envoy_api_v2_core_Node* node_msg =
envoy_api_v2_DiscoveryRequest_mutable_node(request, arena.ptr());
PopulateNode(arena.ptr(), node_, build_version_, user_agent_name_, "",
node_msg);
}
// Add resource_names.
for (const auto& eds_service_name : eds_service_names) {
envoy_api_v2_DiscoveryRequest_add_resource_names(
@ -986,7 +1003,8 @@ grpc_slice XdsApi::CreateLrsInitialRequest(const std::string& server_name) {
envoy_api_v2_core_Node* node_msg =
envoy_service_load_stats_v2_LoadStatsRequest_mutable_node(request,
arena.ptr());
PopulateNode(arena.ptr(), node_, user_agent_name_, server_name, node_msg);
PopulateNode(arena.ptr(), node_, build_version_, user_agent_name_,
server_name, node_msg);
return SerializeLrsRequest(request, arena.ptr());
}

@ -250,7 +250,8 @@ class XdsApi {
private:
const XdsBootstrap::Node* node_;
std::string user_agent_name_;
const std::string build_version_;
const std::string user_agent_name_;
};
} // namespace grpc_core

@ -160,7 +160,17 @@ message Node {
// This is motivated by informing a management server during canary which
// version of Envoy is being tested in a heterogeneous fleet. This will be set
// by Envoy in management server RPCs.
string build_version = 5;
string build_version = 5 [deprecated = true];
// Free-form string that identifies the entity requesting config.
// E.g. "envoy" or "grpc"
string user_agent_name = 6;
oneof user_agent_version_type {
// Free-form string that identifies the version of the entity requesting config.
// E.g. "1.12.2" or "abcd1234", or "SpecialEnvoyBuild"
string user_agent_version = 7;
}
// Client feature support list. These are well known features described
// in the Envoy API repository for a given major version of an API. Client features

Loading…
Cancel
Save