Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Jul 2026 02:58:49 +0000
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: eca7b25c101a - main - kern/sys_ptrace: do not skip P2_PTRACEREQ wait for PT_CLEARSTEP/PT_GET_CHILDREN
Message-ID:  <6a5ee069.24c6d.55bce11@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=eca7b25c101a240472c4c274e725bc294284c827

commit eca7b25c101a240472c4c274e725bc294284c827
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-07-20 22:09:59 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-07-21 02:58:30 +0000

    kern/sys_ptrace: do not skip P2_PTRACEREQ wait for PT_CLEARSTEP/PT_GET_CHILDREN
    
    Reported and reviewed by:       markj
    Fixes:  d3b7bbee9275 ("ptrace(2): add PT_GET_CHILDREN")
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D58364
---
 sys/kern/sys_process.c | 33 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 17 deletions(-)

diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index fc81ac4ca6c8..73e6b64e900b 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -1075,7 +1075,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
 #ifdef COMPAT_FREEBSD32
 	int wrap32 = 0, safe = 0;
 #endif
-	bool proctree_locked, p2_req_set;
+	bool need_can_ptrace, proctree_locked, p2_req_set;
 
 	curp = td->td_proc;
 	proctree_locked = false;
@@ -1162,6 +1162,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
 	/*
 	 * Permissions check
 	 */
+	need_can_ptrace = true;
 	switch (req) {
 	case PT_TRACE_ME:
 		/*
@@ -1204,26 +1205,24 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
 		/* OK */
 		break;
 
-	case PT_CLEARSTEP:
-		/* Allow thread to clear single step for itself */
-		if (td->td_tid == tid)
-			break;
-		goto default_check;
-
-	case PT_GET_CHILDREN:
-		if (p == curp)
-			break;
-		goto default_check;
-
-default_check:
 	default:
+		/*
+		 * Allow thread to clear single step for itself.
+		 * PT_GET_CHILDREN on itself does not need P_TRACED.
+		 */
+		if ((req == PT_CLEARSTEP && td->td_tid == tid) ||
+		    (req == PT_GET_CHILDREN && p == curp))
+			need_can_ptrace = false;
+
 		/*
 		 * Check for ptrace eligibility before waiting for
 		 * holds to drain.
 		 */
-		error = proc_can_ptrace(td, p);
-		if (error != 0)
-			goto fail;
+		if (need_can_ptrace) {
+			error = proc_can_ptrace(td, p);
+			if (error != 0)
+				goto fail;
+		}
 
 		/*
 		 * Block parallel ptrace requests.  Most important, do
@@ -1241,7 +1240,7 @@ default_check:
 			}
 			if (error == 0 && td2->td_proc != p)
 				error = ESRCH;
-			if (error == 0)
+			if (error == 0 && need_can_ptrace)
 				error = proc_can_ptrace(td, p);
 			if (error != 0)
 				goto fail;


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a5ee069.24c6d.55bce11>