From nobody Fri Aug 28 12:05:08 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hWcX517ggz6qH94 for ; Fri, 28 Aug 2026 12:05:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hWcX41dr6z3ByH for ; Fri, 28 Aug 2026 12:05:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1787918708; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=nD3aEjD/aWFMXU/IAqbwmVssi7nqoUQGPBkypOhTGVY=; b=eXDuIHjrnO91bcfyJnFJ73rRw7kFY3DEXTghod84dCFK7MJIm93pEpqt3V5u1+xg4h2PPT apBenN1Sgik9ys3QJOun05ge0JO7g9YuQ2JKRCraf0LdZtVyqju8xRCDbwY180PYVKdM7N MrpL3ZN/K7oRqlLqdXEeLRBhri5FIOBya59RxcCdAMGzI90dNG061911OH/9Ve6qD4q0n9 mRKSjRGFNQ3QsFMPLZysLl65bCRomz4zqYMAFb/Z6MZRQGSAacbstv4lwkg13r8STbdohO td/DIcglz39Iz79iAJVGwfA75xkc/3E7MxShn3E5ZGQeRN8NdJMJypSm1yFGWw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1787918708; a=rsa-sha256; cv=none; b=dY2COaGzqSRCJDob4cxBRkcT+cQOCj9cvxO6AP3JuHFPirB5yPecFYf/Jlt0tV1cHGHYkz l1c15FsmStFvcJ0cEl2d169bCYkd8J2nWN7a009ac/VL4l8yAd3vsCtQP5g4nrk6EQC+Ye XD0PNCu36idAXNBmo1czPHocrHtjhG9eF6i4l6akO2RxLHV3zY8sAXEjM6pPNYD5PkXPiA QMdu8u4DOB/rSGiIE9OIQEWXava2bbWWgbYJFegSrexA9jS97jDsdullo1parmV2r+zGtT n/mFPTvsRU7Cdqj72MOwaV9b70jBLJj6gudHlIu9Qrq4wlRcDi/xOeU80aqVIQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1787918708; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=nD3aEjD/aWFMXU/IAqbwmVssi7nqoUQGPBkypOhTGVY=; b=pBzOACWfbBJXnkPbVFnte/FJu7274tPHNY7Ea4/XbulhjwsaBALyhOIx/0YXpYDggGIXVH cqMBBFkUlfQyDaPJUEfet+Tl5XV0Tezdd8leQ5jShi2uGUgUnV6cf4M/f+8wdQuLUI9Ose JvnmuKAlAyh3gP+j9wuJ+w4yfNiRKH61AWxVQkf2po/OR6t4FdkTI+0WpRSUtOFpRXgvBz 5+5+d8vlWvw0BFBMXnycjO9HUgNeHx4kfjnQ56Or3VuWWLfdlEXG3AZYMPxSo9GqFoYUFN FEnGf9FV7e+s1ErOld7euIIdG2k7i3Zp5VJ9V+KCiO2QchxnMrL3yyQGI3vAqw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hWcX409hDz18JB for ; Fri, 28 Aug 2026 12:05:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 246c7 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 28 Aug 2026 12:05:08 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: f8c0616052e2 - main - Add pdptrace(2) List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f8c0616052e2befaf7271fa82b212ff34a7913af Auto-Submitted: auto-generated Date: Fri, 28 Aug 2026 12:05:08 +0000 Message-Id: <6a917974.246c7.3cb9fb82@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=f8c0616052e2befaf7271fa82b212ff34a7913af commit f8c0616052e2befaf7271fa82b212ff34a7913af Author: Konstantin Belousov AuthorDate: 2026-07-19 21:33:54 +0000 Commit: Konstantin Belousov CommitDate: 2026-08-28 11:52:32 +0000 Add pdptrace(2) Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D58586 --- sys/compat/freebsd32/freebsd32_misc.c | 24 +++++++--- sys/kern/sys_process.c | 83 +++++++++++++++++++++++++---------- sys/kern/syscalls.master | 9 ++++ sys/sys/ptrace.h | 4 +- 4 files changed, 91 insertions(+), 29 deletions(-) diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index 5b5a13a16de1..103a40f221ac 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -1016,8 +1016,8 @@ ptrace_sc_ret32_to_ret(const struct ptrace_sc_ret32 *psr32, } static int -freebsd32_ptrace_useraction(struct thread *td, int req, pid_t pid, - void *uaddr, int udata) +freebsd32_ptrace_useraction(struct thread *td, int req, bool pd_mode, pid_t pid, + int pfd, lwpid_t lwpid, void *uaddr, int udata) { union { struct ptrace_io_desc piod; @@ -1181,7 +1181,7 @@ freebsd32_ptrace_useraction(struct thread *td, int req, pid_t pid, if (error != 0) return (error); - error = ptrace_action(td, req, pid, addr, data); + error = ptrace_action(td, req, pd_mode, pid, pfd, lwpid, addr, data); if (error != 0) return (error); @@ -1259,8 +1259,22 @@ freebsd32_ptrace(struct thread *td, struct freebsd32_ptrace_args *uap) AUDIT_ARG_CMD(uap->req); AUDIT_ARG_VALUE(uap->data); - error = freebsd32_ptrace_useraction(td, uap->req, uap->pid, - uap->addr, uap->data); + error = freebsd32_ptrace_useraction(td, uap->req, false, uap->pid, + -1, -1, uap->addr, uap->data); + return (error); +} + +int +freebsd32_pdptrace(struct thread *td, struct freebsd32_pdptrace_args *uap) +{ + int error; + + AUDIT_ARG_FD(uap->pfd); + AUDIT_ARG_CMD(uap->req); + AUDIT_ARG_VALUE(uap->data); + + error = freebsd32_ptrace_useraction(td, uap->req, true, -1, + uap->pfd, uap->lwpid, uap->addr, uap->data); return (error); } diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 39196561928c..94dbb8215a1e 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -32,7 +32,7 @@ */ #include -#include +#include #include #include #include @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -715,8 +716,8 @@ struct ptrace_args { #endif static int -ptrace_useraction(struct thread *td, int req, pid_t pid, void *uaddr, - int udata) +ptrace_useraction(struct thread *td, int req, bool pd_mode, pid_t pid, int pfd, + lwpid_t lwpid, void *uaddr, int udata) { /* * XXX this obfuscation is to reduce stack usage, but the register @@ -826,7 +827,7 @@ ptrace_useraction(struct thread *td, int req, pid_t pid, void *uaddr, if (error != 0) return (error); - error = ptrace_action(td, req, pid, addr, udata); + error = ptrace_action(td, req, pd_mode, pid, pfd, lwpid, addr, udata); if (error != 0) return (error); @@ -1044,7 +1045,8 @@ ptrace_sel_coredump_thread(struct proc *p) } int -ptrace_action(struct thread *td, int req, pid_t pid, void *addr, int data) +ptrace_action(struct thread *td, int req, bool pd_mode, pid_t pid, int pfd, + lwpid_t lwpid, void *addr, int data) { struct iovec iov; struct uio uio; @@ -1058,6 +1060,7 @@ ptrace_action(struct thread *td, int req, pid_t pid, void *addr, int data) struct ptrace_coredump *pc; struct thr_coredump_req *tcq; struct thr_syscall_req *tsr; + struct file *pfp; struct ptrace_child *children, *ptc; int error, num, num1, tmp; lwpid_t tid = 0, *buf; @@ -1069,6 +1072,7 @@ ptrace_action(struct thread *td, int req, pid_t pid, void *addr, int data) curp = td->td_proc; proctree_locked = false; p2_req_set = false; + pfp = NULL; /* Lock proctree before locking the process. */ switch (req) { @@ -1096,24 +1100,42 @@ ptrace_action(struct thread *td, int req, pid_t pid, void *addr, int data) if (req == PT_TRACE_ME) { p = td->td_proc; PROC_LOCK(p); - } else { - if (pid <= PID_MAX) { - if ((p = pfind(pid)) == NULL) { - if (proctree_locked) - sx_xunlock(&proctree_lock); - return (ESRCH); + } else if (pd_mode) { + if (!proctree_locked) + sx_slock(&proctree_lock); + error = fget_procdesc(td, pfd, &cap_ptrace_rights, EINVAL, + &pfp, NULL, &p); + if (!proctree_locked) + sx_sunlock(&proctree_lock); + if (error != 0) + goto fail_proctree; + pid = p->p_pid; + if (lwpid != -1) { + FOREACH_THREAD_IN_PROC(p, td2) { + if (td2->td_tid == lwpid) + break; } - } else { - td2 = tdfind(pid, -1); if (td2 == NULL) { - if (proctree_locked) - sx_xunlock(&proctree_lock); - return (ESRCH); + PROC_UNLOCK(p); + error = ESRCH; + goto fail_proctree; } - p = td2->td_proc; - tid = pid; - pid = p->p_pid; + tid = td2->td_tid; + } + } else if (pid <= PID_MAX) { + if ((p = pfind(pid)) == NULL) { + error = ESRCH; + goto fail_proctree; + } + } else { + td2 = tdfind(pid, -1); + if (td2 == NULL) { + error = ESRCH; + goto fail_proctree; } + p = td2->td_proc; + tid = pid; + pid = p->p_pid; } AUDIT_ARG_PROCESS(p); @@ -2009,8 +2031,11 @@ fail: p->p_flag2 &= ~P2_PTRACEREQ; } PROC_UNLOCK(p); +fail_proctree: if (proctree_locked) sx_xunlock(&proctree_lock); + if (pfp != NULL) + fdrop(pfp, td); return (error); } #undef PROC_READ @@ -2019,7 +2044,7 @@ fail: int kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) { - return (ptrace_action(td, req, pid, addr, data)); + return (ptrace_action(td, req, false, pid, -1, -1, addr, data)); } int @@ -2031,7 +2056,21 @@ sys_ptrace(struct thread *td, struct ptrace_args *uap) AUDIT_ARG_CMD(uap->req); AUDIT_ARG_VALUE(uap->data); - error = ptrace_useraction(td, uap->req, uap->pid, uap->addr, - uap->data); + error = ptrace_useraction(td, uap->req, false, uap->pid, -1, -1, + uap->addr, uap->data); + return (error); +} + +int +sys_pdptrace(struct thread *td, struct pdptrace_args *uap) +{ + int error; + + AUDIT_ARG_FD(uap->pfd); + AUDIT_ARG_CMD(uap->req); + AUDIT_ARG_VALUE(uap->data); + + error = ptrace_useraction(td, uap->req, true, -1, uap->pfd, uap->lwpid, + uap->addr, uap->data); return (error); } diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 64145f2c3e57..7050e564903e 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -3442,5 +3442,14 @@ int flags ); } +605 AUE_PDPTRACE STD { + int pdptrace( + int req, + int pfd, + int lwpid, + _Inout_opt_ _Contains_long_ptr_ void *addr, + int data + ); + } ; vim: syntax=off diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h index 50e7dba5c946..52f13d4d6790 100644 --- a/sys/sys/ptrace.h +++ b/sys/sys/ptrace.h @@ -291,8 +291,8 @@ int proc_write_dbregs32(struct thread *_td, struct dbreg32 *_dbreg32); #endif void ptrace_unsuspend(struct proc *p); -int ptrace_action(struct thread *td, int req, pid_t pid, void *addr, - int data); +int ptrace_action(struct thread *td, int req, bool pd_mode, pid_t pid, + int pfd, lwpid_t lwpid, void *addr, int data); extern bool allow_ptrace;