Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Aug 2023 17:29:11 GMT
From:      Eric van Gyzen <vangyzen@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: be1dd8e65bc6 - main - proc_detach: use ptrace(PT_KILL) to kill the tracee
Message-ID:  <202308011729.371HTBqJ046937@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202308011729.371HTBqJ046937>