https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=a82bf559088d2b77cef355f4883b6692dcd1eb7c

commit a82bf559088d2b77cef355f4883b6692dcd1eb7c
Author:     Christian Franke <[email protected]>
AuthorDate: Mon Dec 2 17:07:18 2024 +0100
Commit:     Corinna Vinschen <[email protected]>
CommitDate: Mon Dec 2 17:23:43 2024 +0100

    Cygwin: setpriority, sched_setparam: add missing process access right
    
    set_and_check_winprio() also requires PROCESS_QUERY_LIMITED_INFORMATION.
    Also add an early check for this access right to set_and_check_winprio().
    
    Fixes: 153b51ee08ef ("Cygwin: setpriority, sched_setparam: fail if Windows 
sets a lower priority")
    Signed-off-by: Christian Franke <[email protected]>

Diff:
---
 winsup/cygwin/miscfuncs.cc | 2 ++
 winsup/cygwin/sched.cc     | 4 +++-
 winsup/cygwin/syscalls.cc  | 5 +++--
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc
index e3bf35cf7552..ebe401b93f63 100644
--- a/winsup/cygwin/miscfuncs.cc
+++ b/winsup/cygwin/miscfuncs.cc
@@ -190,6 +190,8 @@ bool
 set_and_check_winprio (HANDLE proc, DWORD prio)
 {
   DWORD prev_prio = GetPriorityClass (proc);
+  if (!prev_prio)
+    return false;
   if (prev_prio == prio)
     return true;
 
diff --git a/winsup/cygwin/sched.cc b/winsup/cygwin/sched.cc
index b8067d5470d0..61d5e7be49a3 100644
--- a/winsup/cygwin/sched.cc
+++ b/winsup/cygwin/sched.cc
@@ -260,7 +260,9 @@ sched_setparam (pid_t pid, const struct sched_param *param)
       set_errno (ESRCH);
       return -1;
     }
-  process = OpenProcess (PROCESS_SET_INFORMATION, FALSE, p->dwProcessId);
+  process = OpenProcess (PROCESS_SET_INFORMATION |
+                        PROCESS_QUERY_LIMITED_INFORMATION,
+                        FALSE, p->dwProcessId);
   if (!process)
     {
       set_errno (ESRCH);
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 60350b6904b2..d4fba632c698 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -3869,8 +3869,9 @@ setpriority (int which, id_t who, int value)
                continue;
              break;
            }
-         HANDLE proc_h = OpenProcess (PROCESS_SET_INFORMATION, FALSE,
-                                      p->dwProcessId);
+         HANDLE proc_h = OpenProcess (PROCESS_SET_INFORMATION |
+                                      PROCESS_QUERY_LIMITED_INFORMATION,
+                                      FALSE, p->dwProcessId);
          if (!proc_h)
            error = EPERM;
          else

Reply via email to