The branch stable/13 has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=797e917ed6478832943a1c1dbec8913fc9ad4aa1

commit 797e917ed6478832943a1c1dbec8913fc9ad4aa1
Author:     Mark Johnston <[email protected]>
AuthorDate: 2023-05-26 19:13:20 +0000
Commit:     Mark Johnston <[email protected]>
CommitDate: 2023-06-02 13:17:05 +0000

    tests: Add a simple regression test for ptrace(PT_SC_REMOTE)
    
    MFC after:      1 week
    
    (cherry picked from commit 844942888f7d87885c79d87d808311086c664417)
---
 tests/sys/kern/ptrace_test.c | 55 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 54 insertions(+), 1 deletion(-)

diff --git a/tests/sys/kern/ptrace_test.c b/tests/sys/kern/ptrace_test.c
index 3e3a445c6152..fbaca43bb6c4 100644
--- a/tests/sys/kern/ptrace_test.c
+++ b/tests/sys/kern/ptrace_test.c
@@ -4314,9 +4314,61 @@ ATF_TC_BODY(ptrace__procdesc_reparent_wait_child, tc)
        REQUIRE_EQ(close(pd), 0);
 }
 
-ATF_TP_ADD_TCS(tp)
+/*
+ * Try using PT_SC_REMOTE to get the PID of a traced child process.
+ */
+ATF_TC_WITHOUT_HEAD(ptrace__PT_SC_REMOTE_getpid);
+ATF_TC_BODY(ptrace__PT_SC_REMOTE_getpid, tc)
 {
+       struct ptrace_sc_remote pscr;
+       pid_t fpid, wpid;
+       int status;
+
+       ATF_REQUIRE((fpid = fork()) != -1);
+       if (fpid == 0) {
+               trace_me();
+               exit(0);
+       }
+
+       attach_child(fpid);
+
+       pscr.pscr_syscall = SYS_getpid;
+       pscr.pscr_nargs = 0;
+       pscr.pscr_args = NULL;
+       ATF_REQUIRE(ptrace(PT_SC_REMOTE, fpid, (caddr_t)&pscr, sizeof(pscr)) !=
+           -1);
+       ATF_REQUIRE_MSG(pscr.pscr_ret.sr_error == 0,
+           "remote getpid failed with error %d", pscr.pscr_ret.sr_error);
+       ATF_REQUIRE_MSG(pscr.pscr_ret.sr_retval[0] == fpid,
+           "unexpected return value %lu instead of %d",
+           pscr.pscr_ret.sr_retval[0], fpid);
+
+       wpid = waitpid(fpid, &status, 0);
+       REQUIRE_EQ(wpid, fpid);
+       ATF_REQUIRE(WIFSTOPPED(status));
+       REQUIRE_EQ(WSTOPSIG(status), SIGSTOP);
 
+       pscr.pscr_syscall = SYS_getppid;
+       pscr.pscr_nargs = 0;
+       pscr.pscr_args = NULL;
+       ATF_REQUIRE(ptrace(PT_SC_REMOTE, fpid, (caddr_t)&pscr, sizeof(pscr)) !=
+           -1);
+       ATF_REQUIRE_MSG(pscr.pscr_ret.sr_error == 0,
+           "remote getppid failed with error %d", pscr.pscr_ret.sr_error);
+       ATF_REQUIRE_MSG(pscr.pscr_ret.sr_retval[0] == getpid(),
+           "unexpected return value %lu instead of %d",
+           pscr.pscr_ret.sr_retval[0], fpid);
+
+       wpid = waitpid(fpid, &status, 0);
+       REQUIRE_EQ(wpid, fpid);
+       ATF_REQUIRE(WIFSTOPPED(status));
+       REQUIRE_EQ(WSTOPSIG(status), SIGSTOP);
+
+       ATF_REQUIRE(ptrace(PT_DETACH, fpid, (caddr_t)1, 0) != -1);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
        ATF_TP_ADD_TC(tp, ptrace__parent_wait_after_trace_me);
        ATF_TP_ADD_TC(tp, ptrace__parent_wait_after_attach);
        ATF_TP_ADD_TC(tp, ptrace__parent_sees_exit_after_child_debugger);
@@ -4380,6 +4432,7 @@ ATF_TP_ADD_TCS(tp)
        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);
+       ATF_TP_ADD_TC(tp, ptrace__PT_SC_REMOTE_getpid);
 
        return (atf_no_error());
 }

Reply via email to