summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2020-12-14 14:09:18 +0100
committerGiampaolo Rodola <g.rodola@gmail.com>2020-12-14 14:09:18 +0100
commit0f0c29eb78bd86e98d86d76615f7c46c44bff49b (patch)
tree1983c0dff9bb7b4a3a2bcc3c2c22280ce29c8f74
parent6ea12c3c0a93b1370a1db2670cda60eadbf618dd (diff)
downloadpsutil-0f0c29eb78bd86e98d86d76615f7c46c44bff49b.tar.gz
issue #1877: turn OpenProcess -> ERROR_SUCCESS into AD or NSP
Signed-off-by: Giampaolo Rodola <g.rodola@gmail.com>
-rw-r--r--psutil/arch/windows/process_utils.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/psutil/arch/windows/process_utils.c b/psutil/arch/windows/process_utils.c
index f9d2f2f9..b40449be 100644
--- a/psutil/arch/windows/process_utils.c
+++ b/psutil/arch/windows/process_utils.c
@@ -55,14 +55,16 @@ psutil_get_pids(DWORD *numberOfReturnedPIDs) {
// Return 1 if PID exists, 0 if not, -1 on error.
int
-psutil_pid_in_pids(DWORD pid) {
+psutil_pid_exists(DWORD pid) {
DWORD *proclist = NULL;
DWORD numberOfReturnedPIDs;
DWORD i;
proclist = psutil_get_pids(&numberOfReturnedPIDs);
- if (proclist == NULL)
+ if (proclist == NULL) {
+ psutil_debug("psutil_get_pids() failed");
return -1;
+ }
for (i = 0; i < numberOfReturnedPIDs; i++) {
if (proclist[i] == pid) {
free(proclist);
@@ -85,7 +87,22 @@ psutil_check_phandle(HANDLE hProcess, DWORD pid) {
if (GetLastError() == ERROR_INVALID_PARAMETER) {
// Yeah, this is the actual error code in case of
// "no such process".
- NoSuchProcess("OpenProcess");
+ psutil_debug("OpenProcess -> ERROR_INVALID_PARAMETER turned "
+ "into NSP");
+ NoSuchProcess("OpenProcess -> ERROR_INVALID_PARAMETER");
+ return NULL;
+ }
+ if (GetLastError() == ERROR_SUCCESS) {
+ // Yeah, it's this bad.
+ // https://github.com/giampaolo/psutil/issues/1877
+ if (psutil_pid_exists(pid) == 1) {
+ psutil_debug("OpenProcess -> ERROR_SUCCESS turned into AD");
+ AccessDenied("OpenProcess -> ERROR_SUCCESS");
+ }
+ else {
+ psutil_debug("OpenProcess -> ERROR_SUCCESS turned into NSP");
+ NoSuchProcess("OpenProcess -> ERROR_SUCCESS");
+ }
return NULL;
}
PyErr_SetFromOSErrnoWithSyscall("OpenProcess");
@@ -98,7 +115,7 @@ psutil_check_phandle(HANDLE hProcess, DWORD pid) {
if (exitCode == STILL_ACTIVE) {
return hProcess;
}
- if (psutil_pid_in_pids(pid) == 1) {
+ if (psutil_pid_exists(pid) == 1) {
return hProcess;
}
CloseHandle(hProcess);
@@ -167,5 +184,5 @@ psutil_pid_is_running(DWORD pid) {
CloseHandle(hProcess);
PyErr_Clear();
- return psutil_pid_in_pids(pid);
+ return psutil_pid_exists(pid);
}