[xDS] fix fuzzer-found failure in ClusterSpecifierPlugin handling (#33552)
Fixes b/288542307.
diff --git a/src/core/ext/xds/xds_route_config.cc b/src/core/ext/xds/xds_route_config.cc
index f2dc8ba..2f819b7 100644
--- a/src/core/ext/xds/xds_route_config.cc
+++ b/src/core/ext/xds/xds_route_config.cc
@@ -349,6 +349,10 @@
const envoy_config_core_v3_TypedExtensionConfig* typed_extension_config =
envoy_config_route_v3_ClusterSpecifierPlugin_extension(
cluster_specifier_plugin[i]);
+ if (typed_extension_config == nullptr) {
+ errors->AddError("field not present");
+ continue;
+ }
std::string name = UpbStringToStdString(
envoy_config_core_v3_TypedExtensionConfig_name(typed_extension_config));
if (cluster_specifier_plugin_map.find(name) !=
diff --git a/test/core/xds/xds_client_corpora/rls_missing_typed_extension_config b/test/core/xds/xds_client_corpora/rls_missing_typed_extension_config
new file mode 100644
index 0000000..cd2a6df
--- /dev/null
+++ b/test/core/xds/xds_client_corpora/rls_missing_typed_extension_config
@@ -0,0 +1,26 @@
+bootstrap: "{\"xds_servers\": [{\"server_uri\":\"xds.example.com:-257\", \"channel_creds\":[{\"type\": \"fake\"}]}]}"
+actions {
+ start_watch {
+ resource_type {
+ route_config {
+ }
+ }
+ }
+}
+actions {
+ send_message_to_client {
+ stream_id {
+ ads {
+ }
+ }
+ response {
+ version_info: "grpc.lookup.v1.RouteLookup"
+ resources {
+ type_url: "envoy.config.route.v3.RouteConfiguration"
+ value: "\010\001b\000"
+ }
+ type_url: "envoy.config.route.v3.RouteConfiguration"
+ nonce: "/@\001\000\\\000\000x141183468234106731687303715884105729"
+ }
+ }
+}