Fix: Thread unsafe use of SendPacket for PACKET_SERVER_MAP_SIZE

NetworkTCPSocketHandler::SendPacket is not thread safe and may not
be used concurrently from multiple threads without suitable locking
This commit is contained in:
Jonathan G Rennison 2020-06-18 17:23:50 +01:00 committed by Charles Pigott
parent d662e8ca96
commit c10571d7ce
1 changed files with 13 additions and 3 deletions

View File

@ -153,6 +153,16 @@ struct PacketWriter : SaveFilter {
this->current = nullptr;
}
/** Prepend the current packet to the queue. */
void PrependQueue()
{
if (this->current == nullptr) return;
this->current->next = this->packets;
this->packets = this->current;
this->current = nullptr;
}
void Write(byte *buf, size_t size) override
{
/* We want to abort the saving when the socket is closed. */
@ -193,9 +203,9 @@ struct PacketWriter : SaveFilter {
this->AppendQueue();
/* Fast-track the size to the client. */
Packet *p = new Packet(PACKET_SERVER_MAP_SIZE);
p->Send_uint32((uint32)this->total_size);
this->cs->NetworkTCPSocketHandler::SendPacket(p);
this->current = new Packet(PACKET_SERVER_MAP_SIZE);
this->current->Send_uint32((uint32)this->total_size);
this->PrependQueue();
}
};