From nobody Sat Sep 05 00:35:21 2026 X-Original-To: dev-commits-src-branches@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 4hcDrV3P2lz6qZhP for ; Sat, 05 Sep 2026 00:35:22 +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 4hcDrT4yMrz43sj for ; Sat, 05 Sep 2026 00:35:21 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1788568521; 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=f8+vGFSQU0RX4Vs3M/GiqHSQG61IBXAHSYyExeY9mqI=; b=hPbBR+btBzay27VJq/k4YCnmnCKahtZd6EVPDHO038gfAEmZh8/5Vg0NWNwdq1e/nIypBH qkKRGapH7g3aMpwOYIfYlNOYDEtxZWVuX2ro3yd9vIi1kaD7lL2oG/yLu/55sCE8qJNymh lRTZK0jVRBfnEbndCEgR21f0rL2OyWEuzH5GcBDKIEgjoIqHzQh7hDXhOkGWWQg100BbQX gbq4yHsReO7peagCW/lQZwLVCvonhy+s0proOxZr7Mf5bY9UrjL5AS6ePUF1vdxt+96LgN jk7RGYHzlS83byHYfynnWPlZnnk4LdkC7XSbSffrwcsgPAJ/0NFbzTfCeDUjXA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1788568521; a=rsa-sha256; cv=none; b=qgaIBNBSBkjUDK/USDFwNWGUddaF/VWm/RDjS2rkcBQ//8sECaH8kbdKhv2vA0a2M53+nG Vmr/SG+N4DyIfFHJlbVf/B+T4puFN+qfSK7bymwzhMp/nRKpuueIwcquq237ZAnzbUY29o FrAdD1ge0SyB7geFyJDTBSBxPDQxXNn4CiFit1wG0TdLkxRwTV1RvQYN52rS8XX/ayD9zn eBFUcNpoGbk4NMy7+8Cs9a0SoykBRIk+5Gwu7LpywlVhOaevjVPJOrUL853xEdDOmE3MAa cdTucrFcxGFbsE8jfNEEmWS+qU9RNulQ9NW1JzZVDE5jgH/voNJXyqDttetK+g== 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=1788568521; 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=f8+vGFSQU0RX4Vs3M/GiqHSQG61IBXAHSYyExeY9mqI=; b=jmJzENm4Wgwrm/0FwTRI6pS8T/6Kh3M6RCv/SgIu86pr7mbIpl8SYC3EkbIxJ0JhGd5xxo W/ooVZnCTmrQEBumTJPYX3nRxM/YZNF432KOwnZkFQjTyLWt1HrBkUls1vjjBe1VyQOSdY 9z/qIjU3AxBjyhIeFmlFXgJP2MfqCOXElJ+Uk3RCvIMrR6ZakOL5cFzaAmHkYeCQSHEV2N IlbXLUyV9qI9628ZiiD/iNJmBh7pwQw8KbUHBxDivH4pRPBj05sDCgxA9FhpCjOOlPYk8w vpEBr+aGjMkQaOMpkvYH/l0iour9bdXPHw+9ANGa7zgoDIpZM6nS7+xTVw25gg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hcDrT3y7zz7vS for ; Sat, 05 Sep 2026 00:35:21 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1ec59 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 05 Sep 2026 00:35:21 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: 74883c24a04a - stable/15 - Add pdptrace(2) List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@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/stable/15 X-Git-Reftype: branch X-Git-Commit: 74883c24a04ac0cdf7facd8b80ec536d50ee8c4c Auto-Submitted: auto-generated Date: Sat, 05 Sep 2026 00:35:21 +0000 Message-Id: <6a9b63c9.1ec59.3f0497f7@gitrepo.freebsd.org> The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=74883c24a04ac0cdf7facd8b80ec536d50ee8c4c commit 74883c24a04ac0cdf7facd8b80ec536d50ee8c4c Author: Konstantin Belousov AuthorDate: 2026-07-19 21:33:54 +0000 Commit: Konstantin Belousov CommitDate: 2026-09-05 00:33:38 +0000 Add pdptrace(2) (cherry picked from commit f8c0616052e2befaf7271fa82b212ff34a7913af) --- 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 376390bce531..17ddf6d0bcfc 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 @@ -681,8 +682,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 @@ -792,7 +793,7 @@ ptrace_useraction(struct thread *td, int req, pid_t pid, void *uaddr, if (error) 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); @@ -1010,7 +1011,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; @@ -1024,6 +1026,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; @@ -1035,6 +1038,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) { @@ -1062,24 +1066,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); @@ -1975,8 +1997,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 @@ -1985,7 +2010,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 @@ -1997,7 +2022,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 b4f02e04d9d4..694f927989c2 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -3435,5 +3435,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 9751f68512ab..8d6d9535e825 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;