Skip to content
Permalink
Browse files

Network part requires SharedBuffers to be pass as value

This can trigger unreproductible crashes due to concurrency problem on SharedBuffers

This fixes #6354
  • Loading branch information
nerzhul committed Sep 3, 2017
1 parent 2ac5a45 commit eabf04bd34b840ee3359609fc977cf4795b33a3a
Showing with 8 additions and 10 deletions.
  1. +3 −5 src/network/connection.cpp
  2. +3 −3 src/network/connection.h
  3. +1 −1 src/network/connectionthreads.cpp
  4. +1 −1 src/network/connectionthreads.h
@@ -55,7 +55,7 @@ std::mutex log_message_mutex;

#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 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)
{
u32 original_header_size = 1;
@@ -139,9 +139,7 @@ void makeAutoSplitPacket(const SharedBuffer<u8> &data, u32 chunksize_max,
list->push_back(makeOriginalPacket(data));
}

SharedBuffer<u8> makeReliablePacket(
const SharedBuffer<u8> &data,
u16 seqnum)
SharedBuffer<u8> makeReliablePacket(SharedBuffer<u8> data, u16 seqnum)
{
u32 header_size = 3;
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
BufferedPacket makePacket(Address &address, const SharedBuffer<u8> &data,
BufferedPacket makePacket(Address &address, SharedBuffer<u8> data,
u32 protocol_id, u16 sender_peer_id, u8 channel);

// Depending on size, make a TYPE_ORIGINAL or TYPE_SPLIT packet
// 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);

// 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
{
@@ -330,7 +330,7 @@ void ConnectionSendThread::sendAsPacketReliable(BufferedPacket &p, Channel *chan
}

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);
if (!peer) {
@@ -52,7 +52,7 @@ class ConnectionSendThread : public Thread
private:
void runTimeouts(float dtime);
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);

void processReliableCommand(ConnectionCommand &c);

0 comments on commit eabf04b

Please sign in to comment.
You can’t perform that action at this time.