From 085babd1ea1f4252c9a35f8375c6ecc86f55ce01 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 26 Feb 2026 15:38:45 -0500 Subject: [PATCH] avoid possible double termination. Use atomic swap --- libi2pd/NTCP2.cpp | 4 ++-- libi2pd/NTCP2.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/libi2pd/NTCP2.cpp b/libi2pd/NTCP2.cpp index 9efd8fec..d74c2525 100644 --- a/libi2pd/NTCP2.cpp +++ b/libi2pd/NTCP2.cpp @@ -563,9 +563,9 @@ namespace transport void NTCP2Session::Terminate () { - if (!m_IsTerminated) + bool isTerminated = m_IsTerminated.exchange (true); + if (!isTerminated) { - m_IsTerminated = true; m_IsEstablished = false; boost::system::error_code ec; m_Socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); diff --git a/libi2pd/NTCP2.h b/libi2pd/NTCP2.h index 40a2b21f..55d40ed3 100644 --- a/libi2pd/NTCP2.h +++ b/libi2pd/NTCP2.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -222,7 +223,7 @@ namespace transport NTCP2Server& m_Server; boost::asio::ip::tcp::socket m_Socket; boost::asio::ip::tcp::endpoint m_RemoteEndpoint; - bool m_IsEstablished, m_IsTerminated; + std::atomic m_IsEstablished, m_IsTerminated; std::unique_ptr m_Establisher; // data phase