git: 526becbf6e42 - main - ptrace_test: add test for expanded reporting of syscall args

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Mon, 31 Mar 2025 02:46:06 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=526becbf6e42331e3680d55fe1e9a82e1b56a735

commit 526becbf6e42331e3680d55fe1e9a82e1b56a735
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-03-24 02:44:38 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-03-31 02:45:30 +0000

    ptrace_test: add test for expanded reporting of syscall args
    
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D49430
---
 tests/sys/kern/ptrace_test.c | 48 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/tests/sys/kern/ptrace_test.c b/tests/sys/kern/ptrace_test.c
index 675d90e144ae..db681293f043 100644
--- a/tests/sys/kern/ptrace_test.c
+++ b/tests/sys/kern/ptrace_test.c
@@ -4160,6 +4160,53 @@ ATF_TC_BODY(ptrace__syscall_args, tc)
 	REQUIRE_EQ(errno, ECHILD);
 }
 
+/*
+ * Check that syscall info is available whenever kernel has valid td_sa.
+ * Assumes that libc nanosleep(2) is the plain syscall wrapper.
+ */
+ATF_TC_WITHOUT_HEAD(ptrace__syscall_args_anywhere);
+ATF_TC_BODY(ptrace__syscall_args_anywhere, tc)
+{
+	struct timespec rqt;
+	struct ptrace_lwpinfo lwpi;
+	register_t args[8];
+	pid_t debuggee, wpid;
+	int error, status;
+
+	debuggee = fork();
+	ATF_REQUIRE(debuggee >= 0);
+	if (debuggee == 0) {
+		rqt.tv_sec = 100000;
+		rqt.tv_nsec = 0;
+		for (;;)
+			nanosleep(&rqt, NULL);
+		_exit(0);
+	}
+
+	/* Give the debuggee some time to go to sleep. */
+	sleep(2);
+	error = ptrace(PT_ATTACH, debuggee, 0, 0);
+	ATF_REQUIRE(error == 0);
+	wpid = waitpid(debuggee, &status, 0);
+	REQUIRE_EQ(wpid, debuggee);
+	ATF_REQUIRE(WIFSTOPPED(status));
+	REQUIRE_EQ(WSTOPSIG(status), SIGSTOP);
+
+	error = ptrace(PT_LWPINFO, debuggee, (caddr_t)&lwpi, sizeof(lwpi));
+	ATF_REQUIRE(error == 0);
+	ATF_REQUIRE(lwpi.pl_syscall_code == SYS_nanosleep);
+	ATF_REQUIRE(lwpi.pl_syscall_narg == 2);
+	error = ptrace(PT_GET_SC_ARGS, debuggee, (caddr_t)&args[0],
+	    lwpi.pl_syscall_narg * sizeof(register_t));
+	ATF_REQUIRE(error == 0);
+	ATF_REQUIRE(args[0] == (register_t)&rqt);
+	ATF_REQUIRE(args[1] == 0);
+
+	error = ptrace(PT_DETACH, debuggee, 0, 0);
+	ATF_REQUIRE(error == 0);
+	kill(SIGKILL, debuggee);
+}
+
 /*
  * Verify that when the process is traced that it isn't reparent
  * to the init process when we close all process descriptors.
@@ -4476,6 +4523,7 @@ ATF_TP_ADD_TCS(tp)
 #endif
 	ATF_TP_ADD_TC(tp, ptrace__PT_LWPINFO_stale_siginfo);
 	ATF_TP_ADD_TC(tp, ptrace__syscall_args);
+	ATF_TP_ADD_TC(tp, ptrace__syscall_args_anywhere);
 	ATF_TP_ADD_TC(tp, ptrace__proc_reparent);
 	ATF_TP_ADD_TC(tp, ptrace__procdesc_wait_child);
 	ATF_TP_ADD_TC(tp, ptrace__procdesc_reparent_wait_child);