aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2014-07-10 16:01:11 -0500
committerSubv <subv2112@gmail.com>2014-07-10 16:01:11 -0500
commit128217c4c48140103151bfaed5347f35ffce28f5 (patch)
tree7c44c88679abc9f7f0828e2e0d14543bc627b45d /src
parente84ba172a7aa6df6541460ea279c0e65875f9e45 (diff)
Prevent the WorldSocket from being deleted when there's still an async write operation going on.
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/WorldSocket.cpp7
1 files changed, 5 insertions, 2 deletions
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<char> 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)
{