From c85ce105eedcd355f81badaa351cbd4fe7d4b288 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Sun, 15 Nov 2020 15:30:43 -0800 Subject: [PATCH] Fixing a bug in cpp xds interop client after the use of absl::GetFlag Code used absl::string_view to point into FLAG_xxx, when we changed to uses absl::GetFlag, absl::string_view is pointing into temp variables which results in undefined behaviour for the flags. --- test/cpp/interop/xds_interop_client.cc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/test/cpp/interop/xds_interop_client.cc b/test/cpp/interop/xds_interop_client.cc index 476e6765f65..4013ce9879a 100644 --- a/test/cpp/interop/xds_interop_client.cc +++ b/test/cpp/interop/xds_interop_client.cc @@ -292,23 +292,22 @@ class LoadBalancerStatsServiceImpl : public LoadBalancerStatsService::Service { }; void RunTestLoop(std::chrono::duration duration_per_query) { - std::vector rpc_methods = + std::vector rpc_methods = absl::StrSplit(absl::GetFlag(FLAGS_rpc), ',', absl::SkipEmpty()); // Store Metadata like // "EmptyCall:key1:value1,UnaryCall:key1:value1,UnaryCall:key2:value2" into a // map where the key is the RPC method and value is a vector of key:value // pairs. {EmptyCall, [{key1,value1}], // UnaryCall, [{key1,value1}, {key2,value2}]} - std::vector rpc_metadata = + std::vector rpc_metadata = absl::StrSplit(absl::GetFlag(FLAGS_metadata), ',', absl::SkipEmpty()); std::map>> metadata_map; for (auto& data : rpc_metadata) { - std::vector metadata = + std::vector metadata = absl::StrSplit(data, ':', absl::SkipEmpty()); GPR_ASSERT(metadata.size() == 3); - metadata_map[std::string(metadata[0])].push_back( - {std::string(metadata[1]), std::string(metadata[2])}); + metadata_map[metadata[0]].push_back({metadata[1], metadata[2]}); } TestClient client(grpc::CreateChannel(absl::GetFlag(FLAGS_server), grpc::InsecureChannelCredentials())); @@ -319,11 +318,11 @@ void RunTestLoop(std::chrono::duration duration_per_query) { std::thread thread = std::thread(&TestClient::AsyncCompleteRpc, &client); while (true) { - for (const absl::string_view& rpc_method : rpc_methods) { + for (const std::string& rpc_method : rpc_methods) { elapsed = std::chrono::system_clock::now() - start; if (elapsed > duration_per_query) { start = std::chrono::system_clock::now(); - auto metadata_iter = metadata_map.find(std::string(rpc_method)); + auto metadata_iter = metadata_map.find(rpc_method); if (rpc_method == "EmptyCall") { client.AsyncEmptyCall( metadata_iter != metadata_map.end()