forked from Mirrorlandia_minetest/minetest
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:
parent
2ac5a45faa
commit
eabf04bd34
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user