From 0e3e2d6550f7a3c7bf6e7101f7d428db465a8cd8 Mon Sep 17 00:00:00 2001 From: "seer-by-sentry[bot]" <157164994+seer-by-sentry[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 19:10:51 +0000 Subject: [PATCH] HTTPManager: Clear completion callback to prevent use-after-free during shutdown --- .../Include/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.h | 4 +++- .../Source/GameNetwork/GeneralsOnline/HTTP/HTTPManager.cpp | 2 ++ .../Source/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.cpp | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.h b/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.h index 66ee38bc19c..006370d012c 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.h +++ b/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.h @@ -45,6 +45,8 @@ class HTTPRequest } void InvokeCallbackIfComplete(); + + void ClearCompletionCallback(); #if defined(ARTIFICIAL_DELAY_HTTP_REQUESTS) void SetWaitingDelay(CURLcode result); @@ -97,4 +99,4 @@ class HTTPRequest std::function m_completionCallback = nullptr; std::function m_progressCallback = nullptr; -}; +}; diff --git a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPManager.cpp b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPManager.cpp index 8ac79982f8b..14c0085ef8f 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPManager.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPManager.cpp @@ -91,6 +91,8 @@ void HTTPManager::Shutdown() HTTPRequest* pRequest = *it; if (pRequest != nullptr && pRequest->EasyHandleMatches(pCurlHandle)) { + // Clear the callback to prevent use-after-free during shutdown + pRequest->ClearCompletionCallback(); pRequest->Threaded_SetComplete(m->data.result); delete pRequest; m_vecRequestsInFlight.erase(it); diff --git a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.cpp b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.cpp index ac07945109e..01172492c4c 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPRequest.cpp @@ -109,6 +109,11 @@ void HTTPRequest::InvokeCallbackIfComplete() } } +void HTTPRequest::ClearCompletionCallback() +{ + m_completionCallback = nullptr; +} + #if defined(ARTIFICIAL_DELAY_HTTP_REQUESTS) void HTTPRequest::SetWaitingDelay(CURLcode result) {