diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2019-11-01 03:34:20 -0700 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2019-11-01 03:34:20 -0700 |
commit | 4739c077432c94b73a57de9ecae4795ffa66cfd7 (patch) | |
tree | 8ecd6fe2e7932881d16013dd3748eafc7073cc5c | |
parent | 386a9288fc854626c96eb32d1a5bdd3f7f260b12 (diff) | |
download | psutil-4739c077432c94b73a57de9ecae4795ffa66cfd7.tar.gz |
fix #875: convert ERROR_PARTIAL_COPY from ReadProcessMemory to AccessDenied
-rw-r--r-- | HISTORY.rst | 2 | ||||
-rw-r--r-- | psutil/_psutil_windows.c | 2 | ||||
-rw-r--r-- | psutil/arch/windows/process_info.c | 44 |
3 files changed, 29 insertions, 19 deletions
diff --git a/HISTORY.rst b/HISTORY.rst index 1e8cd0ba..35ae6a18 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -12,6 +12,8 @@ XXXX-XX-XX **Bug fixes** +- 875_: [Windows] Process' cmdline(), environ() or cwd() may occasionally fail + with ERROR_PARTIAL_COPY which now gets translated to AccessDenied. - 1126_: [Linux] cpu_affinity() segfaults on CentOS 5 / manylinux. cpu_affinity() support for CentOS 5 was removed. - 1528_: [AIX] compilation error on AIX 7.2 due to 32 vs 64 bit differences. diff --git a/psutil/_psutil_windows.c b/psutil/_psutil_windows.c index 66a8786d..beaba183 100644 --- a/psutil/_psutil_windows.c +++ b/psutil/_psutil_windows.c @@ -807,7 +807,7 @@ psutil_GetProcWsetInformation( if (!NT_SUCCESS(status)) { if (status == STATUS_ACCESS_DENIED) { - AccessDenied(""); + AccessDenied("originated from NtQueryVirtualMemory"); } else if (psutil_pid_is_running(pid) == 0) { NoSuchProcess(""); diff --git a/psutil/arch/windows/process_info.c b/psutil/arch/windows/process_info.c index 69da28bd..bd568d56 100644 --- a/psutil/arch/windows/process_info.c +++ b/psutil/arch/windows/process_info.c @@ -512,19 +512,17 @@ psutil_get_process_data(long pid, // read PEB if (!ReadProcessMemory(hProcess, ppeb32, &peb32, sizeof(peb32), NULL)) { - PyErr_SetFromOSErrnoWithSyscall("ReadProcessMemory"); - goto error; + goto read_process_memory_error; } // read process parameters if (!ReadProcessMemory(hProcess, - UlongToPtr(peb32.ProcessParameters), - &procParameters32, - sizeof(procParameters32), - NULL)) { - PyErr_SetFromOSErrnoWithSyscall( - "ReadProcessMemory(ProcessParameters)"); - goto error; + UlongToPtr(peb32.ProcessParameters), + &procParameters32, + sizeof(procParameters32), + NULL)) + { + goto read_process_memory_error; } switch (kind) { @@ -657,9 +655,9 @@ psutil_get_process_data(long pid, pbi.PebBaseAddress, &peb, sizeof(peb), - NULL)) { - PyErr_SetFromOSErrnoWithSyscall("ReadProcessMemory"); - goto error; + NULL)) + { + goto read_process_memory_error; } // read process parameters @@ -667,10 +665,9 @@ psutil_get_process_data(long pid, peb.ProcessParameters, &procParameters, sizeof(procParameters), - NULL)) { - PyErr_SetFromOSErrnoWithSyscall( - "ReadProcessMemory(ProcessParameters)"); - goto error; + NULL)) + { + goto read_process_memory_error; } switch (kind) { @@ -721,8 +718,7 @@ psutil_get_process_data(long pid, } else #endif if (!ReadProcessMemory(hProcess, src, buffer, size, NULL)) { - PyErr_SetFromOSErrnoWithSyscall("ReadProcessMemory"); - goto error; + goto read_process_memory_error; } CloseHandle(hProcess); @@ -732,6 +728,18 @@ psutil_get_process_data(long pid, return 0; +read_process_memory_error: + // see: https://github.com/giampaolo/psutil/issues/875 + if (GetLastError() == ERROR_PARTIAL_COPY) { + psutil_debug("ReadProcessMemory() failed with ERROR_PARTIAL_COPY; " + "converting to EACCES"); + AccessDenied("ReadProcessMemory() failed with ERROR_PARTIAL_COPY"); + } + else { + PyErr_SetFromWindowsErr(0); + } + goto error; + error: if (hProcess != NULL) CloseHandle(hProcess); |