From 1b2dc83cf5664626212ed7928afc792f3babda42 Mon Sep 17 00:00:00 2001 From: ohadvano <49730675+ohadvano@users.noreply.github.com> Date: Fri, 12 Jul 2024 06:35:55 +0300 Subject: [PATCH] fluentd_access_logger: check cluster existance (#35138) Additional Description: If a cluster does not exist at the time of logger creation, Envoy would crash. When running in validation mode, the cluster manager returns ``nullptr`` by design, which causes the process to crash. Fixes #35098 Risk Level: low Testing: unit tests Docs Changes: none Release Notes: none Platform Specific Features: none Signed-off-by: Ohad Vano --- .../fluentd/fluentd_access_log_impl.cc | 4 ++++ .../fluentd/fluentd_access_log_impl_test.cc | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/source/extensions/access_loggers/fluentd/fluentd_access_log_impl.cc b/source/extensions/access_loggers/fluentd/fluentd_access_log_impl.cc index a6f312d66d96..69ef4af925e9 100644 --- a/source/extensions/access_loggers/fluentd/fluentd_access_log_impl.cc +++ b/source/extensions/access_loggers/fluentd/fluentd_access_log_impl.cc @@ -167,6 +167,10 @@ FluentdAccessLoggerCacheImpl::getOrCreateLogger(const FluentdAccessLogConfigShar } auto* cluster = cluster_manager_.getThreadLocalCluster(config->cluster()); + if (!cluster) { + return nullptr; + } + auto client = cluster->tcpAsyncClient(nullptr, std::make_shared(false)); diff --git a/test/extensions/access_loggers/fluentd/fluentd_access_log_impl_test.cc b/test/extensions/access_loggers/fluentd/fluentd_access_log_impl_test.cc index 25c5470fa5a5..82b6ec4cc40e 100644 --- a/test/extensions/access_loggers/fluentd/fluentd_access_log_impl_test.cc +++ b/test/extensions/access_loggers/fluentd/fluentd_access_log_impl_test.cc @@ -325,6 +325,21 @@ class FluentdAccessLoggerCacheImplTest : public testing::Test { std::unique_ptr logger_cache_; }; +TEST_F(FluentdAccessLoggerCacheImplTest, CreateLoggerWhenClusterNotFound) { + tls_.setDispatcher(&dispatcher_); + logger_cache_ = std::make_unique(cluster_manager_, scope_, tls_); + EXPECT_CALL(cluster_manager_, getThreadLocalCluster(cluster_name_)).WillOnce(Return(nullptr)); + + envoy::extensions::access_loggers::fluentd::v3::FluentdAccessLogConfig config; + config.set_cluster(cluster_name_); + config.set_tag("test.tag"); + config.mutable_buffer_size_bytes()->set_value(123); + auto logger = + logger_cache_->getOrCreateLogger(std::make_shared(config), random_); + + EXPECT_TRUE(logger == nullptr); +} + TEST_F(FluentdAccessLoggerCacheImplTest, CreateNonExistingLogger) { init(); EXPECT_CALL(cluster_manager_, getThreadLocalCluster(cluster_name_)).WillOnce(Return(&cluster_));