The branch main has been updated by kib:

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

commit 526becbf6e42331e3680d55fe1e9a82e1b56a735
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2025-03-24 02:44:38 +0000
Commit:     Konstantin Belousov <k...@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);

Reply via email to