]> sourceware.org Git - valgrind.git/commitdiff
Fixes for FreeBSD pdkill syscall wrapper
authorPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 24 May 2022 21:39:12 +0000 (23:39 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 24 May 2022 21:40:42 +0000 (23:40 +0200)
coregrind/m_syswrap/syswrap-freebsd.c

index b1d60dac4b8066942a0c649bef86b1eb81bda4f5..8b051952d4aef80649f07f23a8a7ef1ed5faa972 100644 (file)
@@ -5482,10 +5482,30 @@ PRE(sys_pdkill)
       return;
    }
 
-   /* If we're sending SIGKILL, check to see if the target is one of
-      our threads and handle it specially. */
-   if (ARG2 == VKI_SIGKILL && ML_(do_sigkill)(ARG1, -1))
-      SET_STATUS_Success(0);
+   /* Ther was some code here to check if the kill is to this process
+    *
+    * But it was totally wrong
+    *
+    * It was calling ML_(do_sigkill)(Int pid, Int tgid)
+    *
+    * With a file descriptor
+    *
+    * Fortunately this will never match a real process otherwise
+    * it might have accidentally killed us.
+    *
+    * For a start we need the pid, obtained with pdgetpid
+    * Next ML_(do_sigkill) doesn't map to FreeBSD. It takes a
+    * pid (lwpid) and a tgid (threadgroup)
+    *
+    * On FreeBSD lwpid is the tid and threadgroup is the pid
+    * The kill functions operate on pids, not tids.
+    *
+    * One last thing, I don't see how pdkill could do a self
+    * kill 9. It neads an fd which implied pdfork whichimplies
+    * that the fd/pid are for a child process
+    */
+
+   SET_STATUS_from_SysRes(VG_(do_syscall2)(SYSNO, ARG1, ARG2));
 
    if (VG_(clo_trace_signals))
       VG_(message)(Vg_DebugMsg, "pdkill: sent signal %ld to fd %ld\n",
This page took 0.040042 seconds and 5 git commands to generate.