summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2019-11-01 03:34:20 -0700
committerGiampaolo Rodola <g.rodola@gmail.com>2019-11-01 03:34:20 -0700
commit4739c077432c94b73a57de9ecae4795ffa66cfd7 (patch)
tree8ecd6fe2e7932881d16013dd3748eafc7073cc5c
parent386a9288fc854626c96eb32d1a5bdd3f7f260b12 (diff)
downloadpsutil-4739c077432c94b73a57de9ecae4795ffa66cfd7.tar.gz
fix #875: convert ERROR_PARTIAL_COPY from ReadProcessMemory to AccessDenied
-rw-r--r--HISTORY.rst2
-rw-r--r--psutil/_psutil_windows.c2
-rw-r--r--psutil/arch/windows/process_info.c44
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);