avoid possible double termination. Use atomic swap. steady_timer instead deadline_time

This commit is contained in:
orignal
2026-02-26 17:15:35 -05:00
parent 085babd1ea
commit ef05aedceb
2 changed files with 6 additions and 5 deletions
+3 -3
View File
@@ -142,7 +142,7 @@ namespace transport
void SSU2Session::ScheduleConnectTimer ()
{
m_ConnectTimer.cancel ();
m_ConnectTimer.expires_from_now (boost::posix_time::seconds(SSU2_CONNECT_TIMEOUT));
m_ConnectTimer.expires_after (std::chrono::seconds(SSU2_CONNECT_TIMEOUT));
m_ConnectTimer.async_wait (std::bind (&SSU2Session::HandleConnectTimer,
shared_from_this (), std::placeholders::_1));
}
@@ -282,9 +282,9 @@ namespace transport
void SSU2Session::Terminate ()
{
if (m_State != eSSU2SessionStateTerminated)
auto state = m_State.exchange (eSSU2SessionStateTerminated);
if (state != eSSU2SessionStateTerminated)
{
m_State = eSSU2SessionStateTerminated;
m_ConnectTimer.cancel ();
m_OnEstablished = nullptr;
if (m_RelayTag)
+3 -2
View File
@@ -11,6 +11,7 @@
#include <memory>
#include <functional>
#include <atomic>
#include <map>
#include <set>
#include <list>
@@ -374,7 +375,7 @@ namespace transport
i2p::data::RouterInfo::CompatibleTransports m_RemoteTransports, m_RemotePeerTestTransports;
int m_RemoteVersion;
uint64_t m_DestConnID, m_SourceConnID;
SSU2SessionState m_State;
std::atomic<SSU2SessionState> m_State;
uint8_t m_KeyDataSend[64], m_KeyDataReceive[64];
uint32_t m_SendPacketNum, m_ReceivePacketNum, m_LastDatetimeSentPacketNum;
std::set<uint32_t> m_OutOfSequencePackets; // packet nums > receive packet num
@@ -392,7 +393,7 @@ namespace transport
size_t m_WindowSize, m_RTO;
uint32_t m_RelayTag; // between Bob and Charlie
OnEstablished m_OnEstablished; // callback from Established
boost::asio::deadline_timer m_ConnectTimer;
boost::asio::steady_timer m_ConnectTimer;
SSU2TerminationReason m_TerminationReason;
size_t m_MaxPayloadSize;
std::unique_ptr<std::pair<uint64_t, boost::asio::ip::udp::endpoint> > m_PathChallenge;