From c9a462c693227222c102cd05f4d4544252ee14ae Mon Sep 17 00:00:00 2001 From: Carbenium Date: Sat, 23 Jan 2016 01:05:43 +0100 Subject: [PATCH] Authserver: Fix a memory leak --- src/server/shared/Networking/AsyncAcceptor.h | 19 +++++++++++++++---- src/server/shared/Networking/SocketMgr.h | 10 +++++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/server/shared/Networking/AsyncAcceptor.h index 260e1c8ea11..d02284d3f28 100644 --- a/src/server/shared/Networking/AsyncAcceptor.h +++ b/src/server/shared/Networking/AsyncAcceptor.h @@ -30,7 +30,7 @@ public: AsyncAcceptor(boost::asio::io_service& ioService, std::string const& bindIp, uint16 port) : _acceptor(ioService, tcp::endpoint(boost::asio::ip::address::from_string(bindIp), port)), - _socket(ioService) + _socket(ioService), _closed(false) { } @@ -54,14 +54,24 @@ public: TC_LOG_INFO("network", "Failed to initialize client's socket %s", err.what()); } } - - AsyncAcceptManaged(mgrHandler); + if (!_closed) + AsyncAcceptManaged(mgrHandler); }); } + void Close() + { + if (_closed.exchange(true)) + return; + + boost::system::error_code err; + _acceptor.close(err); + } + private: tcp::acceptor _acceptor; tcp::socket _socket; + std::atomic _closed; }; template @@ -83,7 +93,8 @@ void AsyncAcceptor::AsyncAccept() } // lets slap some more this-> on this so we can fix this bug with gcc 4.7.2 throwing internals in yo face - this->AsyncAccept(); + if (!_closed) + this->AsyncAccept(); }); } diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h index ce5bc2d8fc2..d92d2ea4154 100644 --- a/src/server/shared/Networking/SocketMgr.h +++ b/src/server/shared/Networking/SocketMgr.h @@ -33,7 +33,7 @@ class SocketMgr public: virtual ~SocketMgr() { - delete[] _threads; + ASSERT(!_threads && !_acceptor && !_threadCount, "StopNetwork must be called prior to SocketMgr destruction"); } virtual bool StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port) @@ -68,10 +68,18 @@ public: virtual void StopNetwork() { + _acceptor->Close(); + if (_threadCount != 0) for (int32 i = 0; i < _threadCount; ++i) _threads[i].Stop(); + delete _acceptor; + _acceptor = nullptr; + delete[] _threads; + _threads = nullptr; + _threadCount = 0; + Wait(); }