]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#4282] Fixed TSAN reported issue
authorFrancis Dupont <fdupont@isc.org>
Mon, 19 Jan 2026 16:55:15 +0000 (17:55 +0100)
committerFrancis Dupont <fdupont@isc.org>
Tue, 20 Jan 2026 09:31:10 +0000 (10:31 +0100)
src/hooks/dhcp/radius/radius_request.cc
src/hooks/dhcp/radius/radius_service.cc
src/hooks/dhcp/radius/radius_service.h

index 3ab877599548daad21323a2df38fe6ffabccaa8c..557cb3fc4c0e39036a5fe61ad7383c97a882ce1f 100644 (file)
@@ -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)
index d9c0b3c6d4ce3506fc5978ff70773e0dc15f4c9d..0571afb892b40e759ef5971304b0c5601744a7ba 100644 (file)
@@ -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_() {
index ea931020c52cb30fe09b451ee4101f9f79e8bd46..c3a8a3f7e89972e1638c2d23edc39a762465a3ee 100644 (file)
@@ -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.