git: be1dd8e65bc6 - main - proc_detach: use ptrace(PT_KILL) to kill the tracee
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 01 Aug 2023 17:29:11 UTC
The branch main has been updated by vangyzen: URL: https://cgit.FreeBSD.org/src/commit/?id=be1dd8e65bc607aae2e873ad80076a87869f6755 commit be1dd8e65bc607aae2e873ad80076a87869f6755 Author: Eric van Gyzen <vangyzen@FreeBSD.org> AuthorDate: 2023-07-25 16:58:11 +0000 Commit: Eric van Gyzen <vangyzen@FreeBSD.org> CommitDate: 2023-08-01 17:28:50 +0000 proc_detach: use ptrace(PT_KILL) to kill the tracee When MFC'ing commit dad11f990e2 to stable/12, the child would dump core when dtrace exited. It was getting SIGTRAP, even though proc_detach sent a SIGKILL. I could not find the reason for this difference in behavior from main (and stable/13). The present change, however, works as expected, probably due the proc_wkilled special case in kern_ptrace. It also seems like a more obvious approach. While I'm here, fix two other issues in the previous code: It would SIGKILL a tracee even in read-only mode. It would SIGSTOP/SIGCONT the tracee if ptrace succeeded but errno happened to be EBUSY for some other reason. Reviewed by: markj MFC after: 1 week Sponsored by: Dell EMC Isilon Differential Revision: https://reviews.freebsd.org/D41122 --- lib/libproc/proc_util.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/libproc/proc_util.c b/lib/libproc/proc_util.c index 36d0de76e8fe..cd2c0dff3451 100644 --- a/lib/libproc/proc_util.c +++ b/lib/libproc/proc_util.c @@ -85,25 +85,21 @@ int proc_detach(struct proc_handle *phdl, int reason) { int status; + int request; pid_t pid; if (phdl == NULL) return (EINVAL); if (reason == PRELEASE_HANG) return (EINVAL); - if (reason == PRELEASE_KILL) { - kill(proc_getpid(phdl), SIGKILL); - goto free; - } if ((phdl->flags & PATTACH_RDONLY) != 0) goto free; + request = (reason == PRELEASE_KILL) ? PT_KILL : PT_DETACH; pid = proc_getpid(phdl); - if (ptrace(PT_DETACH, pid, 0, 0) != 0 && errno == ESRCH) - goto free; - if (errno == EBUSY) { + if (ptrace(request, pid, 0, 0) != 0 && errno == EBUSY) { kill(pid, SIGSTOP); waitpid(pid, &status, WUNTRACED); - ptrace(PT_DETACH, pid, 0, 0); + ptrace(request, pid, 0, 0); kill(pid, SIGCONT); } free: