diff --git a/Streaming.cpp b/Streaming.cpp index f1ceb7c9..852d11a6 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -844,6 +844,7 @@ namespace stream StreamingDestination::StreamingDestination (std::shared_ptr owner, uint16_t localPort, bool gzip): m_Owner (owner), m_LocalPort (localPort), m_Gzip (gzip), + m_LastIncomingReceiveStreamID (0), m_PendingIncomingTimer (m_Owner->GetService ()), m_ConnTrackTimer(m_Owner->GetService()), m_ConnsPerMinute(DEFAULT_MAX_CONNS_PER_MIN), @@ -899,8 +900,15 @@ namespace stream { if (packet->IsSYN () && !packet->GetSeqn ()) // new incoming stream { - auto incomingStream = CreateNewIncomingStream (); uint32_t receiveStreamID = packet->GetReceiveStreamID (); + if (receiveStreamID == m_LastIncomingReceiveStreamID) + { + // already pending + LogPrint(eLogWarning, "Streaming: Incoming streaming with rSID=", receiveStreamID, " already exists"); + delete packet; // drop it, because previous should be connected + return; + } + auto incomingStream = CreateNewIncomingStream (); incomingStream->HandleNextPacket (packet); // SYN auto ident = incomingStream->GetRemoteIdentity(); if(ident) @@ -914,6 +922,8 @@ namespace stream return; } } + m_LastIncomingReceiveStreamID = receiveStreamID; + // handle saved packets if any { auto it = m_SavedPackets.find (receiveStreamID); diff --git a/Streaming.h b/Streaming.h index 2be724ed..e4a1562c 100644 --- a/Streaming.h +++ b/Streaming.h @@ -253,6 +253,7 @@ namespace stream std::mutex m_StreamsMutex; std::map > m_Streams; // sendStreamID->stream Acceptor m_Acceptor; + uint32_t m_LastIncomingReceiveStreamID; std::list > m_PendingIncomingStreams; boost::asio::deadline_timer m_PendingIncomingTimer; std::map > m_SavedPackets; // receiveStreamID->packets, arrived before SYN