Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2004-03-13 21:11:13 +0300
committerCorinna Vinschen <corinna@vinschen.de>2004-03-13 21:11:13 +0300
commit5817840adfff858867a0b9dfec089a2b67751cb9 (patch)
tree806c978a8667f7fc9e5160a8c6e7f1f7ab549713 /winsup
parent2e93c97146c56855dbf88d4d1ba9cd7ceaf4ab45 (diff)
* kill.cc (get_debug_priv): New function.
(forcekill): Call get_debug_priv before trying to kill process.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/utils/ChangeLog5
-rw-r--r--winsup/utils/kill.cc30
2 files changed, 35 insertions, 0 deletions
diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog
index c6f1d9e50..1aa9e1ffc 100644
--- a/winsup/utils/ChangeLog
+++ b/winsup/utils/ChangeLog
@@ -1,3 +1,8 @@
+2004-03-13 Rob Siklos <rob2@siklos.ca>
+
+ * kill.cc (get_debug_priv): New function.
+ (forcekill): Call get_debug_priv before trying to kill process.
+
2004-02-24 Christopher Faylor <cgf@redhat.com>
* cygpath.cc (long_options): Add "mode" option.
diff --git a/winsup/utils/kill.cc b/winsup/utils/kill.cc
index a4dba050d..deb0b41a3 100644
--- a/winsup/utils/kill.cc
+++ b/winsup/utils/kill.cc
@@ -125,9 +125,38 @@ listsig (const char *in_sig)
}
}
+static void
+get_debug_priv (void)
+{
+ HANDLE tok;
+ LUID luid;
+ TOKEN_PRIVILEGES tkp;
+
+ if (!OpenProcessToken (GetCurrentProcess (),
+ TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tok))
+ return;
+
+ if (!LookupPrivilegeValue (NULL, SE_DEBUG_NAME, &luid))
+ {
+ CloseHandle (tok);
+ return;
+ }
+
+ tkp.PrivilegeCount = 1;
+ tkp.Privileges[0].Luid = luid;
+ tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+
+ AdjustTokenPrivileges (tok, FALSE, &tkp, sizeof tkp, NULL, NULL);
+
+ CloseHandle (tok);
+}
+
static void __stdcall
forcekill (int pid, int sig, int wait)
{
+ // try to acquire SeDebugPrivilege
+ get_debug_priv();
+
external_pinfo *p = (external_pinfo *) cygwin_internal (CW_GETPINFO_FULL, pid);
DWORD dwpid = p ? p->dwProcessId : (DWORD) pid;
HANDLE h = OpenProcess (PROCESS_TERMINATE, FALSE, (DWORD) dwpid);
@@ -254,3 +283,4 @@ out:
}
return ret;
}
+