]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-125315: Avoid crashing in _wmimodule due to slow WMI calls on some Windows machine...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 30 Oct 2024 20:17:35 +0000 (21:17 +0100)
committerGitHub <noreply@github.com>
Wed, 30 Oct 2024 20:17:35 +0000 (20:17 +0000)
(cherry picked from commit 60c415bd531392a239c23c754154a7944695ac99)

Co-authored-by: Steve Dower <steve.dower@python.org>
Misc/NEWS.d/next/Windows/2024-10-29-19-48-03.gh-issue-125315.jdB9qN.rst [new file with mode: 0644]
PC/_wmimodule.cpp

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 (file)
index 0000000..3d81324
--- /dev/null
@@ -0,0 +1,2 @@
+Avoid crashing in :mod:`platform` due to slow WMI calls on some Windows
+machines.
index 22ed05276e6f0716972068397c5bb81e23755743..2c24761be6400d1c941b7beaaaa67edec90e9b04 100644 (file)
@@ -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"),