Skip to content
Snippets Groups Projects
Commit d1e018ca authored by Sébastien Blin's avatar Sébastien Blin
Browse files

natpmp: pass shared pointer to timer to avoid crash

Change-Id: I1fbf84f8fb10b14390abb951b8ed312716047936
parent c453ca7f
Branches
No related tags found
No related merge requests found
......@@ -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!",
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment