git: 39321b7a1462 - stable/15 - ptrace(2): add PT_GET_ABI_NAME request

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Sat, 05 Sep 2026 00:35:26 UTC
The branch stable/15 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=39321b7a14620485f1fd9ff7b769398cfda2dfdb

commit 39321b7a14620485f1fd9ff7b769398cfda2dfdb
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-08-22 22:53:14 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-09-05 00:33:40 +0000

    ptrace(2): add PT_GET_ABI_NAME request
    
    (cherry picked from commit 6b9ef5dfc903c29e1d23bb6369b762251f2608f7)
---
 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 17ddf6d0bcfc..0752e84e7c4e 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -703,10 +703,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);
@@ -783,6 +784,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;
@@ -842,6 +851,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);
@@ -1975,6 +1988,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 8d6d9535e825..942af4eba51f 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