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>
