Network part requires SharedBuffers to be pass as value

This can trigger unreproductible crashes due to concurrency problem on SharedBuffers

This fixes #6354
This commit is contained in:
Loic Blot 2017-09-03 19:01:53 +02:00
parent 2ac5a45faa
commit eabf04bd34
No known key found for this signature in database
GPG Key ID: EFAA458E8C153987
4 changed files with 8 additions and 10 deletions

@ -55,7 +55,7 @@ std::mutex log_message_mutex;
#define PING_TIMEOUT 5.0 #define PING_TIMEOUT 5.0
BufferedPacket makePacket(Address &address, const SharedBuffer<u8> &data, BufferedPacket makePacket(Address &address, SharedBuffer<u8> data,
u32 protocol_id, u16 sender_peer_id, u8 channel) u32 protocol_id, u16 sender_peer_id, u8 channel)
{ {
u32 packet_size = data.getSize() + BASE_HEADER_SIZE; u32 packet_size = data.getSize() + BASE_HEADER_SIZE;
@ -125,7 +125,7 @@ void makeSplitPacket(const SharedBuffer<u8> &data, u32 chunksize_max, u16 seqnum
} }
} }
void makeAutoSplitPacket(const SharedBuffer<u8> &data, u32 chunksize_max, void makeAutoSplitPacket(SharedBuffer<u8> data, u32 chunksize_max,
u16 &split_seqnum, std::list<SharedBuffer<u8>> *list) u16 &split_seqnum, std::list<SharedBuffer<u8>> *list)
{ {
u32 original_header_size = 1; u32 original_header_size = 1;
@ -139,9 +139,7 @@ void makeAutoSplitPacket(const SharedBuffer<u8> &data, u32 chunksize_max,
list->push_back(makeOriginalPacket(data)); list->push_back(makeOriginalPacket(data));
} }
SharedBuffer<u8> makeReliablePacket( SharedBuffer<u8> makeReliablePacket(SharedBuffer<u8> data, u16 seqnum)
const SharedBuffer<u8> &data,
u16 seqnum)
{ {
u32 header_size = 3; u32 header_size = 3;
u32 packet_size = data.getSize() + header_size; u32 packet_size = data.getSize() + header_size;

@ -102,16 +102,16 @@ struct BufferedPacket
}; };
// This adds the base headers to the data and makes a packet out of it // This adds the base headers to the data and makes a packet out of it
BufferedPacket makePacket(Address &address, const SharedBuffer<u8> &data, BufferedPacket makePacket(Address &address, SharedBuffer<u8> data,
u32 protocol_id, u16 sender_peer_id, u8 channel); u32 protocol_id, u16 sender_peer_id, u8 channel);
// Depending on size, make a TYPE_ORIGINAL or TYPE_SPLIT packet // Depending on size, make a TYPE_ORIGINAL or TYPE_SPLIT packet
// Increments split_seqnum if a split packet is made // Increments split_seqnum if a split packet is made
void makeAutoSplitPacket(const SharedBuffer<u8> &data, u32 chunksize_max, void makeAutoSplitPacket(SharedBuffer<u8> data, u32 chunksize_max,
u16 &split_seqnum, std::list<SharedBuffer<u8>> *list); u16 &split_seqnum, std::list<SharedBuffer<u8>> *list);
// Add the TYPE_RELIABLE header to the data // Add the TYPE_RELIABLE header to the data
SharedBuffer<u8> makeReliablePacket(const SharedBuffer<u8> &data, u16 seqnum); SharedBuffer<u8> makeReliablePacket(SharedBuffer<u8> data, u16 seqnum);
struct IncomingSplitPacket struct IncomingSplitPacket
{ {

@ -330,7 +330,7 @@ void ConnectionSendThread::sendAsPacketReliable(BufferedPacket &p, Channel *chan
} }
bool ConnectionSendThread::rawSendAsPacket(u16 peer_id, u8 channelnum, bool ConnectionSendThread::rawSendAsPacket(u16 peer_id, u8 channelnum,
const SharedBuffer<u8> &data, bool reliable) SharedBuffer<u8> data, bool reliable)
{ {
PeerHelper peer = m_connection->getPeerNoEx(peer_id); PeerHelper peer = m_connection->getPeerNoEx(peer_id);
if (!peer) { if (!peer) {

@ -52,7 +52,7 @@ public:
private: private:
void runTimeouts(float dtime); void runTimeouts(float dtime);
void rawSend(const BufferedPacket &packet); void rawSend(const BufferedPacket &packet);
bool rawSendAsPacket(u16 peer_id, u8 channelnum, const SharedBuffer<u8> &data, bool rawSendAsPacket(u16 peer_id, u8 channelnum, SharedBuffer<u8> data,
bool reliable); bool reliable);
void processReliableCommand(ConnectionCommand &c); void processReliableCommand(ConnectionCommand &c);