From 73b3fbc2daefc3258d3d1bd1c16f9fd17d528866 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Tue, 24 Apr 2018 11:42:37 -0400 Subject: [PATCH] wrap m_OpenSockets with mutex --- libi2pd_client/SAM.cpp | 16 ++++++++++------ libi2pd_client/SAM.h | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/libi2pd_client/SAM.cpp b/libi2pd_client/SAM.cpp index 6511d8ba..0edc8252 100644 --- a/libi2pd_client/SAM.cpp +++ b/libi2pd_client/SAM.cpp @@ -33,7 +33,7 @@ namespace client if(m_Stream) { m_Stream->AsyncClose (); - m_Stream.reset (); + m_Stream = nullptr; } auto Session = m_Owner.FindSession(m_ID); switch (m_SocketType) @@ -64,7 +64,7 @@ namespace client m_Socket.shutdown (boost::asio::ip::tcp::socket::shutdown_both, ec); m_Socket.close (); } - m_Owner.RemoveSocket(this); + m_Owner.RemoveSocket(shared_from_this()); } void SAMSocket::ReceiveHandshake () @@ -974,9 +974,10 @@ namespace client std::placeholders::_1, newSocket)); } - void SAMBridge::RemoveSocket(const SAMSocket * socket) + void SAMBridge::RemoveSocket(const std::shared_ptr & socket) { - m_OpenSockets.remove_if([socket](const std::shared_ptr & item) -> bool { return item.get() == socket; }); + std::unique_lock lock(m_OpenSocketsMutex); + m_OpenSockets.remove_if([socket](const std::shared_ptr & item) -> bool { return item == socket; }); } void SAMBridge::HandleAccept(const boost::system::error_code& ecode, std::shared_ptr socket) @@ -988,7 +989,10 @@ namespace client if (!ec) { LogPrint (eLogDebug, "SAM: new connection from ", ep); - m_OpenSockets.push_back(socket); + { + std::unique_lock l(m_OpenSocketsMutex); + m_OpenSockets.push_back(socket); + } socket->ReceiveHandshake (); } else @@ -1074,7 +1078,7 @@ namespace client { std::list > list; { - std::unique_lock l(m_SessionsMutex); + std::unique_lock l(m_OpenSocketsMutex); for (const auto & itr : m_OpenSockets) if (itr->IsSession(id)) list.push_back(itr); diff --git a/libi2pd_client/SAM.h b/libi2pd_client/SAM.h index d14e5e39..23cdf170 100644 --- a/libi2pd_client/SAM.h +++ b/libi2pd_client/SAM.h @@ -182,7 +182,7 @@ namespace client /** send raw data to remote endpoint from our UDP Socket */ void SendTo(const uint8_t * buf, size_t len, std::shared_ptr remote); - void RemoveSocket(const SAMSocket * socket); + void RemoveSocket(const std::shared_ptr & socket); private: @@ -204,6 +204,7 @@ namespace client boost::asio::ip::udp::socket m_DatagramSocket; mutable std::mutex m_SessionsMutex; std::map > m_Sessions; + mutable std::mutex m_OpenSocketsMutex; std::list > m_OpenSockets; uint8_t m_DatagramReceiveBuffer[i2p::datagram::MAX_DATAGRAM_SIZE+1];