From: Francis Dupont Date: Mon, 19 Jan 2026 16:55:15 +0000 (+0100) Subject: [#4282] Fixed TSAN reported issue X-Git-Tag: Kea-3.1.5~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46fd1d4a121a02f1547e268fabab7b5a1fbe3543;p=thirdparty%2Fkea.git [#4282] Fixed TSAN reported issue --- diff --git a/src/hooks/dhcp/radius/radius_request.cc b/src/hooks/dhcp/radius/radius_request.cc index 3ab8775995..557cb3fc4c 100644 --- a/src/hooks/dhcp/radius/radius_request.cc +++ b/src/hooks/dhcp/radius/radius_request.cc @@ -86,12 +86,16 @@ RadiusSyncAuth::start() { LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_AUTHENTICATION_SYNC_ACCEPTED) .arg(recv_attrs ? recv_attrs->toText() : "no attributes"); - RadiusImpl::instance().auth_->setIdleTimer(); + if (!RadiusImpl::shutdown_) { + RadiusImpl::instance().auth_->setIdleTimer(); + } } else if (result == REJECT_RC) { LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_AUTHENTICATION_SYNC_REJECTED) .arg(recv_attrs ? recv_attrs->toText() : "no attributes"); - RadiusImpl::instance().auth_->setIdleTimer(); + if (!RadiusImpl::shutdown_) { + RadiusImpl::instance().auth_->setIdleTimer(); + } } else { LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_AUTHENTICATION_SYNC_FAILED) @@ -147,12 +151,16 @@ RadiusAsyncAuth::invokeCallback(const CallbackAuth& callback, LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_AUTHENTICATION_ASYNC_ACCEPTED) .arg(recv_attrs ? recv_attrs->toText() : "no attributes"); - RadiusImpl::instance().auth_->setIdleTimer(); + if (!RadiusImpl::shutdown_) { + RadiusImpl::instance().auth_->setIdleTimer(); + } } else if (result == REJECT_RC) { LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_AUTHENTICATION_ASYNC_REJECTED) .arg(recv_attrs ? recv_attrs->toText() : "no attributes"); - RadiusImpl::instance().auth_->setIdleTimer(); + if (!RadiusImpl::shutdown_) { + RadiusImpl::instance().auth_->setIdleTimer(); + } } else { LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_AUTHENTICATION_ASYNC_FAILED) @@ -187,7 +195,9 @@ RadiusSyncAcct::start() { if (result == OK_RC) { LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_ACCOUNTING_SYNC_SUCCEED); - RadiusImpl::instance().acct_->setIdleTimer(); + if (!RadiusImpl::shutdown_) { + RadiusImpl::instance().acct_->setIdleTimer(); + } } else { LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_ACCOUNTING_SYNC_FAILED) @@ -237,7 +247,9 @@ RadiusAsyncAcct::invokeCallback(const CallbackAcct& callback, if (result == OK_RC) { LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_ACCOUNTING_ASYNC_SUCCEED); - RadiusImpl::instance().acct_->setIdleTimer(); + if (!RadiusImpl::shutdown_) { + RadiusImpl::instance().acct_->setIdleTimer(); + } } else { LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_ACCOUNTING_ASYNC_FAILED) diff --git a/src/hooks/dhcp/radius/radius_service.cc b/src/hooks/dhcp/radius/radius_service.cc index d9c0b3c6d4..0571afb892 100644 --- a/src/hooks/dhcp/radius/radius_service.cc +++ b/src/hooks/dhcp/radius/radius_service.cc @@ -17,6 +17,9 @@ using namespace isc::util; namespace isc { namespace radius { +std::mutex +RadiusService::idle_timer_mutex_; + RadiusService::RadiusService(const std::string& name) : name_(name), enabled_(false), peer_updates_(true), max_pending_requests_(0), idle_timer_interval_(), idle_timer_() { diff --git a/src/hooks/dhcp/radius/radius_service.h b/src/hooks/dhcp/radius/radius_service.h index ea931020c5..c3a8a3f7e8 100644 --- a/src/hooks/dhcp/radius/radius_service.h +++ b/src/hooks/dhcp/radius/radius_service.h @@ -64,13 +64,15 @@ public: /// @brief Idle timer. asiolink::IntervalTimerPtr idle_timer_; - /// @brief Idle timer mutex. - std::mutex idle_timer_mutex_; - /// @brief Cancel idle timer. /// /// @note: The caller must hold the idle timer mutex. void cancelIdleTimer(); + + /// @brief Idle timer mutex. + /// + /// @note: shared between all instances of RadiusService. + static std::mutex idle_timer_mutex_; }; /// @brief Type of pointers to Radius service.