diff --git a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPManager.cpp b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPManager.cpp index cfbb4fdbee0..7a3f38fe3f0 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPManager.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/HTTP/HTTPManager.cpp @@ -195,9 +195,6 @@ void HTTPManager::Initialize() { CHECK_MAIN_THREAD; - // Initialize libcurl global state - curl_global_init(CURL_GLOBAL_DEFAULT); - m_pCurl = curl_multi_init(); m_bProxyEnabled = DeterminePlatformProxySettings(); } diff --git a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp index 3530de6fcd1..688ef28eb1e 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp @@ -987,6 +987,11 @@ void NGMP_OnlineServicesManager::Tick() void NGMP_OnlineServicesManager::InitSentry() { + // Initialize libcurl global state here, before any plugins (e.g. EasyAntiCheat) are loaded. + // This ensures libcurl's internal mutexes are fully initialized before the EAC plugin + // attempts to use them, preventing an access violation in mtx_do_lock on null mutex state. + curl_global_init(CURL_GLOBAL_DEFAULT); + #if !_DEBUG std::string strDumpPath = std::format("{}/GeneralsOnlineCrashData/", TheGlobalData->getPath_UserData().str()); if (!std::filesystem::exists(strDumpPath))