aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2019-09-12 12:29:47 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2019-10-15 10:30:08 +0000
commite48dcb7a01cc91aa9d33797da1d1effcbe0cd5ad (patch)
tree1743876f2bcb45963e04accdaaff64a80a548ef1
parentMerge pull request #5876 (diff)
downloadmonero-e48dcb7a01cc91aa9d33797da1d1effcbe0cd5ad.tar.xz
levin: armour against some "should not happen" case
If adding a response handler after the protocol is released, they could never be cancelled again, and would end up keeping a ref that never goes away
-rw-r--r--contrib/epee/include/net/levin_protocol_handler_async.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/contrib/epee/include/net/levin_protocol_handler_async.h b/contrib/epee/include/net/levin_protocol_handler_async.h
index 41f01e9a0..5774c0ba7 100644
--- a/contrib/epee/include/net/levin_protocol_handler_async.h
+++ b/contrib/epee/include/net/levin_protocol_handler_async.h
@@ -272,6 +272,11 @@ public:
bool add_invoke_response_handler(const callback_t &cb, uint64_t timeout, async_protocol_handler& con, int command)
{
CRITICAL_REGION_LOCAL(m_invoke_response_handlers_lock);
+ if (m_protocol_released)
+ {
+ MERROR("Adding response handler to a released object");
+ return false;
+ }
boost::shared_ptr<invoke_response_handler_base> handler(boost::make_shared<anvoke_handler<callback_t>>(cb, timeout, con, command));
m_invoke_response_handlers.push_back(handler);
return handler->is_timer_started();