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

Reply via email to