From 2dddb22c5bc8974e1c831b5d150b747b465e9e54 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Wed, 28 Dec 2022 16:05:39 -0500
Subject: [PATCH] turn_cache: cancel refresh on destruction

Change-Id: I617fb2e53142ed94806a46aef5c62f04197066b1
---
 src/connectivity/turn_cache.cpp | 25 ++++++++++++++++++-------
 src/sip/sipaccountbase.cpp      |  3 +--
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/connectivity/turn_cache.cpp b/src/connectivity/turn_cache.cpp
index ed7783c993..3b07fd5903 100644
--- a/src/connectivity/turn_cache.cpp
+++ b/src/connectivity/turn_cache.cpp
@@ -40,14 +40,19 @@ TurnCache::TurnCache(const std::string& accountId,
                                                          std::chrono::steady_clock::now());
     onConnectedTimer_ = std::make_unique<asio::steady_timer>(*io_context,
                                                          std::chrono::steady_clock::now());
-    reconfigure(params, enabled);
 }
 
 TurnCache::~TurnCache() {
     {
         std::lock_guard<std::mutex> lock(shutdownMtx_);
-        onConnectedTimer_->cancel();
-        onConnectedTimer_.reset();
+        if (refreshTimer_) {
+            refreshTimer_->cancel();
+            refreshTimer_.reset();
+        }
+        if (onConnectedTimer_) {
+            onConnectedTimer_->cancel();
+            onConnectedTimer_.reset();
+        }
     }
     {
         std::lock_guard<std::mutex> lock(cachedTurnMutex_);
@@ -83,8 +88,11 @@ TurnCache::reconfigure(const TurnTransportParams& params, bool enabled)
         testTurnV4_.reset();
         testTurnV6_.reset();
     }
-    refreshTimer_->expires_at(std::chrono::steady_clock::now());
-    refreshTimer_->async_wait(std::bind(&TurnCache::refresh, this, std::placeholders::_1));
+    std::lock_guard<std::mutex> lock(shutdownMtx_);
+    if (refreshTimer_) {
+        refreshTimer_->expires_at(std::chrono::steady_clock::now());
+        refreshTimer_->async_wait(std::bind(&TurnCache::refresh, shared_from_this(), std::placeholders::_1));
+    }
 }
 
 void
@@ -214,9 +222,12 @@ TurnCache::refreshTurnDelay(bool scheduleNext)
 {
     isRefreshing_ = false;
     if (scheduleNext) {
+        std::lock_guard<std::mutex> lock(shutdownMtx_);
         JAMI_WARNING("[Account {:s}] Cache for TURN resolution failed.", accountId_);
-        refreshTimer_->expires_at(std::chrono::steady_clock::now() + turnRefreshDelay_);
-        refreshTimer_->async_wait(std::bind(&TurnCache::refresh, shared_from_this(), std::placeholders::_1));
+        if (refreshTimer_) {
+            refreshTimer_->expires_at(std::chrono::steady_clock::now() + turnRefreshDelay_);
+            refreshTimer_->async_wait(std::bind(&TurnCache::refresh, shared_from_this(), std::placeholders::_1));
+        }
         if (turnRefreshDelay_ < std::chrono::minutes(30))
             turnRefreshDelay_ *= 2;
     } else {
diff --git a/src/sip/sipaccountbase.cpp b/src/sip/sipaccountbase.cpp
index fa3609aa81..8dc78cc717 100644
--- a/src/sip/sipaccountbase.cpp
+++ b/src/sip/sipaccountbase.cpp
@@ -154,9 +154,8 @@ SIPAccountBase::loadConfig()
                                                  cachePath,
                                                  turnParams,
                                                  conf.turnEnabled);
-    } else {
-        turnCache_->reconfigure(turnParams, conf.turnEnabled);
     }
+    turnCache_->reconfigure(turnParams, conf.turnEnabled);
 }
 
 std::map<std::string, std::string>
-- 
GitLab