Merge pull request #8859 from Atlante45/seq-num-race

Fix sequence number race condition
This commit is contained in:
Brad Hefta-Gaub 2016-10-20 08:26:31 -07:00 committed by GitHub
commit 6109f41ae2
2 changed files with 15 additions and 2 deletions

View file

@ -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);
}

View file

@ -16,6 +16,7 @@
#include <functional>
#include <unordered_map>
#include <mutex>
#include <QtCore/QObject>
#include <QtCore/QTimer>
@ -46,6 +47,10 @@ using MessageFailureHandler = std::function<void(HifiSockAddr, udt::Packet::Mess
class Socket : public QObject {
Q_OBJECT
using Mutex = std::mutex;
using Lock = std::unique_lock<Mutex>;
public:
using StatsVector = std::vector<std::pair<HifiSockAddr, ConnectionStats::Stats>>;
@ -121,7 +126,9 @@ private:
MessageHandler _messageHandler;
MessageFailureHandler _messageFailureHandler;
ConnectionCreationFilterOperator _connectionCreationFilterOperator;
Mutex _unreliableSequenceNumbersMutex;
std::unordered_map<HifiSockAddr, BasePacketHandler> _unfilteredHandlers;
std::unordered_map<HifiSockAddr, SequenceNumber> _unreliableSequenceNumbers;
std::unordered_map<HifiSockAddr, std::unique_ptr<Connection>> _connectionsHash;