From bc8554fd9045c6d816492071079276754b3190aa Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 19 Oct 2016 13:31:00 -0700 Subject: [PATCH] Fix sequence number race condition --- libraries/networking/src/udt/Socket.cpp | 8 +++++++- libraries/networking/src/udt/Socket.h | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index 16a1bd1639..6dddf50e0a 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -118,8 +118,14 @@ qint64 Socket::writeBasePacket(const udt::BasePacket& packet, const HifiSockAddr qint64 Socket::writePacket(const Packet& packet, const HifiSockAddr& sockAddr) { Q_ASSERT_X(!packet.isReliable(), "Socket::writePacket", "Cannot send a reliable packet unreliably"); + SequenceNumber sequenceNumber; + { + Lock lock(_unreliableSequenceNumbersMutex); + sequenceNumber = ++_unreliableSequenceNumbers[sockAddr]; + } + // write the correct sequence number to the Packet here - packet.writeSequenceNumber(++_unreliableSequenceNumbers[sockAddr]); + packet.writeSequenceNumber(sequenceNumber); return writeDatagram(packet.getData(), packet.getDataSize(), sockAddr); } diff --git a/libraries/networking/src/udt/Socket.h b/libraries/networking/src/udt/Socket.h index cced0c53df..2a6d119b64 100644 --- a/libraries/networking/src/udt/Socket.h +++ b/libraries/networking/src/udt/Socket.h @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -46,6 +47,10 @@ using MessageFailureHandler = std::function; + public: using StatsVector = std::vector>; @@ -121,7 +126,9 @@ private: MessageHandler _messageHandler; MessageFailureHandler _messageFailureHandler; ConnectionCreationFilterOperator _connectionCreationFilterOperator; - + + Mutex _unreliableSequenceNumbersMutex; + std::unordered_map _unfilteredHandlers; std::unordered_map _unreliableSequenceNumbers; std::unordered_map> _connectionsHash;