diff --git a/docs/root/version_history/current.rst b/docs/root/version_history/current.rst index 9a4d1b7e40a83..8300923b81507 100644 --- a/docs/root/version_history/current.rst +++ b/docs/root/version_history/current.rst @@ -12,6 +12,7 @@ Minor Behavior Changes Bug Fixes --------- *Changes expected to improve the state of the world and are unlikely to have negative effects* +* listener: fix crash when disabling or re-enabling listeners due to overload while processing LDS updates. Removed Config or Runtime ------------------------- diff --git a/docs/root/version_history/version_history.rst b/docs/root/version_history/version_history.rst index 4e37d1cb1b493..453bda753f1ff 100644 --- a/docs/root/version_history/version_history.rst +++ b/docs/root/version_history/version_history.rst @@ -7,6 +7,7 @@ Version history :titlesonly: current + v1.16.0 v1.15.2 v1.15.1 v1.15.0 diff --git a/source/server/connection_handler_impl.cc b/source/server/connection_handler_impl.cc index 0ca74c60c4286..fd5586fb78cd2 100644 --- a/source/server/connection_handler_impl.cc +++ b/source/server/connection_handler_impl.cc @@ -423,6 +423,18 @@ void ConnectionHandlerImpl::ActiveTcpListener::onAcceptWorker( } } +void ConnectionHandlerImpl::ActiveTcpListener::pauseListening() { + if (listener_ != nullptr) { + listener_->disable(); + } +} + +void ConnectionHandlerImpl::ActiveTcpListener::resumeListening() { + if (listener_ != nullptr) { + listener_->enable(); + } +} + void ConnectionHandlerImpl::ActiveTcpListener::newConnection( Network::ConnectionSocketPtr&& socket, std::unique_ptr stream_info) { // Find matching filter chain. diff --git a/source/server/connection_handler_impl.h b/source/server/connection_handler_impl.h index 3eb3e8e58c351..62ddf0c11be76 100644 --- a/source/server/connection_handler_impl.h +++ b/source/server/connection_handler_impl.h @@ -137,8 +137,8 @@ class ConnectionHandlerImpl : public Network::ConnectionHandler, // ActiveListenerImplBase Network::Listener* listener() override { return listener_.get(); } - void pauseListening() override { listener_->disable(); } - void resumeListening() override { listener_->enable(); } + void pauseListening() override; + void resumeListening() override; void shutdownListener() override { listener_.reset(); } // Network::BalancedConnectionHandler diff --git a/test/server/connection_handler_test.cc b/test/server/connection_handler_test.cc index 47d58f94e256f..dbb6a5698e437 100644 --- a/test/server/connection_handler_test.cc +++ b/test/server/connection_handler_test.cc @@ -451,6 +451,22 @@ TEST_F(ConnectionHandlerTest, AddDisabledListener) { handler_->addListener(absl::nullopt, *test_listener); } +TEST_F(ConnectionHandlerTest, DisableListenerAfterStop) { + InSequence s; + + Network::TcpListenerCallbacks* listener_callbacks; + auto listener = new NiceMock(); + TestListener* test_listener = + addListener(1, false, false, "test_listener", listener, &listener_callbacks); + EXPECT_CALL(*socket_factory_, localAddress()).WillOnce(ReturnRef(local_address_)); + handler_->addListener(absl::nullopt, *test_listener); + + EXPECT_CALL(*listener, onDestroy()); + + handler_->stopListeners(); + handler_->disableListeners(); +} + TEST_F(ConnectionHandlerTest, DestroyCloseConnections) { InSequence s;