| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,2 @@ | |||
| 1 | + Fix a race in internal calls into WMI that can result in an "invalid handle" | ||
| 2 | + exception under high load. Patch by Chris Eibl. | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -57,11 +57,11 @@ _query_thread(LPVOID param) | |||
| 57 | 57 | IEnumWbemClassObject* enumerator = NULL; | |
| 58 | 58 | HRESULT hr = S_OK; | |
| 59 | 59 | BSTR bstrQuery = NULL; | |
| 60 | - struct _query_data *data = (struct _query_data*)param; | ||
| 60 | + _query_data data = *(struct _query_data*)param; | ||
| 61 | 61 | ||
| 62 | 62 | // gh-125315: Copy the query string first, so that if the main thread gives | |
| 63 | 63 | // up on waiting we aren't left with a dangling pointer (and a likely crash) | |
| 64 | - bstrQuery = SysAllocString(data->query); | ||
| 64 | + bstrQuery = SysAllocString(data.query); | ||
| 65 | 65 | if (!bstrQuery) { | |
| 66 | 66 | hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); | |
| 67 | 67 | } | |
@@ -71,7 +71,7 @@ _query_thread(LPVOID param) | |||
| 71 | 71 | } | |
| 72 | 72 | ||
| 73 | 73 | if (FAILED(hr)) { | |
| 74 | - CloseHandle(data->writePipe); | ||
| 74 | + CloseHandle(data.writePipe); | ||
| 75 | 75 | if (bstrQuery) { | |
| 76 | 76 | SysFreeString(bstrQuery); | |
| 77 | 77 | } | |
@@ -96,7 +96,7 @@ _query_thread(LPVOID param) | |||
| 96 | 96 | IID_IWbemLocator, (LPVOID *)&locator | |
| 97 | 97 | ); | |
| 98 | 98 | } | |
| 99 | - if (SUCCEEDED(hr) && !SetEvent(data->initEvent)) { | ||
| 99 | + if (SUCCEEDED(hr) && !SetEvent(data.initEvent)) { | ||
| 100 | 100 | hr = HRESULT_FROM_WIN32(GetLastError()); | |
| 101 | 101 | } | |
| 102 | 102 | if (SUCCEEDED(hr)) { | |
@@ -105,7 +105,7 @@ _query_thread(LPVOID param) | |||
| 105 | 105 | NULL, NULL, 0, NULL, 0, 0, &services | |
| 106 | 106 | ); | |
| 107 | 107 | } | |
| 108 | - if (SUCCEEDED(hr) && !SetEvent(data->connectEvent)) { | ||
| 108 | + if (SUCCEEDED(hr) && !SetEvent(data.connectEvent)) { | ||
| 109 | 109 | hr = HRESULT_FROM_WIN32(GetLastError()); | |
| 110 | 110 | } | |
| 111 | 111 | if (SUCCEEDED(hr)) { | |
@@ -143,7 +143,7 @@ _query_thread(LPVOID param) | |||
| 143 | 143 | if (FAILED(hr) || got != 1 || !value) { | |
| 144 | 144 | continue; | |
| 145 | 145 | } | |
| 146 | - if (!startOfEnum && !WriteFile(data->writePipe, (LPVOID)L"\0", 2, &written, NULL)) { | ||
| 146 | + if (!startOfEnum && !WriteFile(data.writePipe, (LPVOID)L"\0", 2, &written, NULL)) { | ||
| 147 | 147 | hr = HRESULT_FROM_WIN32(GetLastError()); | |
| 148 | 148 | break; | |
| 149 | 149 | } | |
@@ -171,10 +171,10 @@ _query_thread(LPVOID param) | |||
| 171 | 171 | DWORD cbStr1, cbStr2; | |
| 172 | 172 | cbStr1 = (DWORD)(wcslen(propName) * sizeof(propName[0])); | |
| 173 | 173 | cbStr2 = (DWORD)(wcslen(propStr) * sizeof(propStr[0])); | |
| 174 | - if (!WriteFile(data->writePipe, propName, cbStr1, &written, NULL) || | ||
| 175 | - !WriteFile(data->writePipe, (LPVOID)L"=", 2, &written, NULL) || | ||
| 176 | - !WriteFile(data->writePipe, propStr, cbStr2, &written, NULL) || | ||
| 177 | - !WriteFile(data->writePipe, (LPVOID)L"\0", 2, &written, NULL) | ||
| 174 | + if (!WriteFile(data.writePipe, propName, cbStr1, &written, NULL) || | ||
| 175 | + !WriteFile(data.writePipe, (LPVOID)L"=", 2, &written, NULL) || | ||
| 176 | + !WriteFile(data.writePipe, propStr, cbStr2, &written, NULL) || | ||
| 177 | + !WriteFile(data.writePipe, (LPVOID)L"\0", 2, &written, NULL) | ||
| 178 | 178 | ) { | |
| 179 | 179 | hr = HRESULT_FROM_WIN32(GetLastError()); | |
| 180 | 180 | } | |
@@ -200,7 +200,7 @@ _query_thread(LPVOID param) | |||
| 200 | 200 | locator->Release(); | |
| 201 | 201 | } | |
| 202 | 202 | CoUninitialize(); | |
| 203 | - CloseHandle(data->writePipe); | ||
| 203 | + CloseHandle(data.writePipe); | ||
| 204 | 204 | return (DWORD)hr; | |
| 205 | 205 | } | |
| 206 | 206 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments