The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=6b9ef5dfc903c29e1d23bb6369b762251f2608f7
commit 6b9ef5dfc903c29e1d23bb6369b762251f2608f7 Author: Konstantin Belousov <[email protected]> AuthorDate: 2026-08-22 22:53:14 +0000 Commit: Konstantin Belousov <[email protected]> CommitDate: 2026-08-28 11:53:01 +0000 ptrace(2): add PT_GET_ABI_NAME request Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D59113 --- sys/compat/freebsd32/freebsd32_misc.c | 12 ++++++++++++ sys/kern/sys_process.c | 20 +++++++++++++++++++- sys/sys/ptrace.h | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index 103a40f221ac..4da3b4ee97c1 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -1033,6 +1033,7 @@ freebsd32_ptrace_useraction(struct thread *td, int req, bool pd_mode, pid_t pid, struct ptrace_sc_ret psr; int ptevents; struct ptrace_child *children; + char sv_name[32]; } r; union { struct ptrace_io_desc32 piod; @@ -1171,6 +1172,13 @@ freebsd32_ptrace_useraction(struct thread *td, int req, bool pd_mode, pid_t pid, else addr = &r.children; break; + case PT_GET_ABI_NAME: + if (udata < 0) { + error = EINVAL; + break; + } + data = sizeof(r.sv_name); + break; case PTINTERNAL_FIRST ... PTINTERNAL_LAST: error = EINVAL; break; @@ -1245,6 +1253,10 @@ freebsd32_ptrace_useraction(struct thread *td, int req, bool pd_mode, pid_t pid, free(r.children, M_TEMP); } break; + case PT_GET_ABI_NAME: + error = udata <= strlen(r.sv_name) ? ENOMEM : + copyout(&r.sv_name, uaddr, strlen(r.sv_name) + 1); + break; } return (error); diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 94dbb8215a1e..2cf9ffaa68dd 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -737,10 +737,11 @@ ptrace_useraction(struct thread *td, int req, bool pd_mode, pid_t pid, int pfd, struct ptrace_sc_ret psr; int ptevents; struct ptrace_child *children; + char sv_name[32]; } r; syscallarg_t pscr_args[nitems(td->td_sa.args)]; void *addr; - int error; + int error, data; if (!allow_ptrace) return (ENOSYS); @@ -817,6 +818,14 @@ ptrace_useraction(struct thread *td, int req, bool pd_mode, pid_t pid, int pfd, else addr = &r.children; break; + case PT_GET_ABI_NAME: + if (udata < 0) { + error = EINVAL; + break; + } + data = udata; + udata = sizeof(r.sv_name); + break; case PTINTERNAL_FIRST ... PTINTERNAL_LAST: error = EINVAL; break; @@ -876,6 +885,10 @@ ptrace_useraction(struct thread *td, int req, bool pd_mode, pid_t pid, int pfd, free(r.children, M_TEMP); } break; + case PT_GET_ABI_NAME: + error = data <= strlen(r.sv_name) ? ENOMEM : + copyout(&r.sv_name, uaddr, strlen(r.sv_name) + 1); + break; } return (error); @@ -2009,6 +2022,11 @@ get_children_repeat: PROC_LOCK(p); break; + case PT_GET_ABI_NAME: + if (strlcpy(addr, p->p_sysent->sv_name, data) >= data) + error = ENOMEM; + break; + default: #ifdef __HAVE_PTRACE_MACHDEP if (req >= PT_FIRSTMACH) { diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h index 52f13d4d6790..1e219b606dbd 100644 --- a/sys/sys/ptrace.h +++ b/sys/sys/ptrace.h @@ -87,6 +87,7 @@ #define PT_SC_REMOTE 44 /* Execute a syscall */ #define PT_SET_SC_RET 45 /* Set (fake) syscall results */ #define PT_GET_CHILDREN 46 /* Report children */ +#define PT_GET_ABI_NAME 47 /* Report ABI name */ #define PT_FIRSTMACH 64 /* for machine-specific requests */ #define PT_LASTMACH 127
