Skip to content

Commit

Permalink
Network part requires SharedBuffers to be pass as value
Browse files Browse the repository at this point in the history
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 eabf04b
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 10 deletions.
8 changes: 3 additions & 5 deletions src/network/connection.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
6 changes: 3 additions & 3 deletions src/network/connection.h
Expand Up @@ -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
{
Expand Down
2 changes: 1 addition & 1 deletion src/network/connectionthreads.cpp
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/network/connectionthreads.h
Expand Up @@ -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);
Expand Down

0 comments on commit eabf04b

Please sign in to comment.