From 128217c4c48140103151bfaed5347f35ffce28f5 Mon Sep 17 00:00:00 2001 From: Subv Date: Thu, 10 Jul 2014 16:01:11 -0500 Subject: Prevent the WorldSocket from being deleted when there's still an async write operation going on. --- src/server/game/Server/WorldSocket.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 0a2619eeb3e..a77c253ce1a 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -163,12 +163,15 @@ void WorldSocket::AsyncWrite(WorldPacket const& packet) if (!packet.empty()) std::memcpy(data + header.getHeaderLength(), (char const*)packet.contents(), packet.size()); + // Use a shared_ptr here to prevent leaking memory after the async operation has completed std::shared_ptr buffer(data, [=](char* _b) { - delete[] _b; + delete[] _b; // Ensure that the data is deleted as an array }); - boost::asio::async_write(_socket, boost::asio::buffer(buffer.get(), header.getHeaderLength() + packet.size()), [this, buffer](boost::system::error_code error, std::size_t /*length*/) + auto self(shared_from_this()); + + boost::asio::async_write(_socket, boost::asio::buffer(buffer.get(), header.getHeaderLength() + packet.size()), [this, self, buffer](boost::system::error_code error, std::size_t /*length*/) { if (error) { -- cgit v1.2.3