epee: avoid bad_weak_ptr during connection teardown

foreach_connection() can race with connection destruction while the
protocol handler remains in the raw-pointer map. Use the non-throwing
weak_from_this().lock() in add_ref() and treat expired connections as
unavailable.

This is an interim mitigation pending the broader connection lifetime
fix in PR 7345.
This commit is contained in:
selsta
2026-07-11 16:22:25 +02:00
parent 641e5ca588
commit d4363111b9
@@ -1221,16 +1221,13 @@ namespace net_utils
template<typename T>
bool connection<T>::add_ref()
{
try {
auto self = connection<T>::shared_from_this();
std::lock_guard<std::mutex> guard(m_state.lock);
this->self = std::move(self);
++m_state.protocol.reference_counter;
return true;
}
catch (boost::bad_weak_ptr &exception) {
auto self = connection<T>::weak_from_this().lock();
if (!self)
return false;
}
std::lock_guard<std::mutex> guard(m_state.lock);
this->self = std::move(self);
++m_state.protocol.reference_counter;
return true;
}
template<typename T>