diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-12-22 13:06:28 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-12-22 13:06:28 +0100 |
| commit | b69a1a71c6b3c604f5eed1d0752f66981a4efc25 (patch) | |
| tree | 762aefb04270e86b8aa2b6f2d527291baae8b6f5 /src/common/network/Http | |
| parent | a4bbb6197002d76d084ced8a0f6fa79ff7bcc922 (diff) | |
Core/Network: Fix invalid NetworkThread array access for derived classes that have additional data members (only HttpService threads were affected)
Diffstat (limited to 'src/common/network/Http')
| -rw-r--r-- | src/common/network/Http/HttpService.h | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/src/common/network/Http/HttpService.h b/src/common/network/Http/HttpService.h index 1549893576f..bca573f431d 100644 --- a/src/common/network/Http/HttpService.h +++ b/src/common/network/Http/HttpService.h @@ -113,9 +113,28 @@ template<typename Callable, typename SessionImpl> concept HttpRequestHandler = invocable_r<Callable, RequestHandlerResult, std::shared_ptr<SessionImpl>, RequestContext&>; template<typename SessionImpl> -class HttpService : public SocketMgr<SessionImpl>, public DispatcherService, public SessionService +class HttpNetworkThread final : public NetworkThread<SessionImpl> { public: + explicit HttpNetworkThread(SessionService* service) : _service(service) { } + +protected: + void SocketRemoved(std::shared_ptr<SessionImpl> const& session) override + { + if (Optional<boost::uuids::uuid> id = session->GetSessionId()) + _service->MarkSessionInactive(*id); + } + +private: + SessionService* _service = nullptr; +}; + +template<typename SessionImpl> +class HttpService : public SocketMgr<SessionImpl, HttpNetworkThread<SessionImpl>>, public DispatcherService, public SessionService +{ + using BaseSocketMgr = SocketMgr<SessionImpl, HttpNetworkThread<SessionImpl>>; + +public: HttpService(std::string_view loggerSuffix) : DispatcherService(loggerSuffix), SessionService(loggerSuffix), _ioContext(nullptr), _logger("server.http.") { _logger.append(loggerSuffix); @@ -123,7 +142,7 @@ public: bool StartNetwork(Asio::IoContext& ioContext, std::string const& bindIp, uint16 port, int32 threadCount = 1) override { - if (!SocketMgr<SessionImpl>::StartNetwork(ioContext, bindIp, port, threadCount)) + if (!BaseSocketMgr::StartNetwork(ioContext, bindIp, port, threadCount)) return false; SessionService::Start(ioContext); @@ -133,7 +152,7 @@ public: void StopNetwork() override { SessionService::Stop(); - SocketMgr<SessionImpl>::StopNetwork(); + BaseSocketMgr::StopNetwork(); } // http handling @@ -157,26 +176,11 @@ public: } protected: - class Thread : public NetworkThread<SessionImpl> - { - protected: - void SocketRemoved(std::shared_ptr<SessionImpl> const& session) override - { - if (Optional<boost::uuids::uuid> id = session->GetSessionId()) - _service->MarkSessionInactive(*id); - } - - private: - friend HttpService; - - SessionService* _service; - }; - - NetworkThread<SessionImpl>* CreateThreads() const override + HttpNetworkThread<SessionImpl>* CreateThreads() const final { - Thread* threads = new Thread[this->GetNetworkThreadCount()]; + HttpNetworkThread<SessionImpl>* threads = static_cast<HttpNetworkThread<SessionImpl>*>(::operator new(sizeof(HttpNetworkThread<SessionImpl>) * this->GetNetworkThreadCount())); for (int32 i = 0; i < this->GetNetworkThreadCount(); ++i) - threads[i]._service = const_cast<HttpService*>(this); + new (&threads[i]) HttpNetworkThread<SessionImpl>(const_cast<HttpService*>(this)); return threads; } |
