From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Wed, 30 Oct 2024 20:17:35 +0000 (+0100) Subject: gh-125315: Avoid crashing in _wmimodule due to slow WMI calls on some Windows machine... X-Git-Tag: v3.12.8~138 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4a846f291e0b56a06b505a4ff20ee830e12e0541;p=thirdparty%2FPython%2Fcpython.git gh-125315: Avoid crashing in _wmimodule due to slow WMI calls on some Windows machines (GH-126141) (cherry picked from commit 60c415bd531392a239c23c754154a7944695ac99) Co-authored-by: Steve Dower --- diff --git a/Misc/NEWS.d/next/Windows/2024-10-29-19-48-03.gh-issue-125315.jdB9qN.rst b/Misc/NEWS.d/next/Windows/2024-10-29-19-48-03.gh-issue-125315.jdB9qN.rst new file mode 100644 index 000000000000..3d813248766a --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2024-10-29-19-48-03.gh-issue-125315.jdB9qN.rst @@ -0,0 +1,2 @@ +Avoid crashing in :mod:`platform` due to slow WMI calls on some Windows +machines. diff --git a/PC/_wmimodule.cpp b/PC/_wmimodule.cpp index 22ed05276e6f..2c24761be640 100644 --- a/PC/_wmimodule.cpp +++ b/PC/_wmimodule.cpp @@ -55,12 +55,26 @@ _query_thread(LPVOID param) IWbemLocator *locator = NULL; IWbemServices *services = NULL; IEnumWbemClassObject* enumerator = NULL; + HRESULT hr = S_OK; BSTR bstrQuery = NULL; struct _query_data *data = (struct _query_data*)param; - HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + // gh-125315: Copy the query string first, so that if the main thread gives + // up on waiting we aren't left with a dangling pointer (and a likely crash) + bstrQuery = SysAllocString(data->query); + if (!bstrQuery) { + hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); + } + + if (SUCCEEDED(hr)) { + hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + } + if (FAILED(hr)) { CloseHandle(data->writePipe); + if (bstrQuery) { + SysFreeString(bstrQuery); + } return (DWORD)hr; } @@ -101,12 +115,6 @@ _query_thread(LPVOID param) NULL, EOAC_NONE ); } - if (SUCCEEDED(hr)) { - bstrQuery = SysAllocString(data->query); - if (!bstrQuery) { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - } - } if (SUCCEEDED(hr)) { hr = services->ExecQuery( bstr_t("WQL"),