From d1e018ca4b0996a298b86a160268abb3f11b50cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Fri, 1 Sep 2023 09:15:12 -0400 Subject: [PATCH] natpmp: pass shared pointer to timer to avoid crash Change-Id: I1fbf84f8fb10b14390abb951b8ed312716047936 --- src/upnp/protocol/natpmp/nat_pmp.cpp | 8 +++++--- src/upnp/protocol/natpmp/nat_pmp.h | 7 +++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/upnp/protocol/natpmp/nat_pmp.cpp b/src/upnp/protocol/natpmp/nat_pmp.cpp index c5e8ce6..48e010a 100644 --- a/src/upnp/protocol/natpmp/nat_pmp.cpp +++ b/src/upnp/protocol/natpmp/nat_pmp.cpp @@ -186,9 +186,11 @@ NatPmp::searchForIgd() // Cancel the current timer (if any) and re-schedule. searchForIgdTimer_.expires_after(NATPMP_SEARCH_RETRY_UNIT * igdSearchCounter_); - searchForIgdTimer_.async_wait([this](const asio::error_code& ec) { - if (!ec) - searchForIgd(); + searchForIgdTimer_.async_wait([w=weak()](const asio::error_code& ec) { + if (!ec) { + if (auto shared = w.lock()) + shared->searchForIgd(); + } }); } else { if (logger_) logger_->warn("NAT-PMP: Setup failed after {} trials. NAT-PMP will be disabled!", diff --git a/src/upnp/protocol/natpmp/nat_pmp.h b/src/upnp/protocol/natpmp/nat_pmp.h index fbc2fc0..1545399 100644 --- a/src/upnp/protocol/natpmp/nat_pmp.h +++ b/src/upnp/protocol/natpmp/nat_pmp.h @@ -149,6 +149,13 @@ private: // Shutdown synchronization bool shutdownComplete_ {false}; + + // Asio :( + // https://stackoverflow.com/questions/35507956/is-it-safe-to-destroy-boostasio-timer-from-its-handler-or-handler-dtor + std::weak_ptr<NatPmp> weak() + { + return std::static_pointer_cast<NatPmp>(shared_from_this()); + } }; } // namespace upnp -- GitLab