git: 797e917ed647 - stable/13 - tests: Add a simple regression test for ptrace(PT_SC_REMOTE)
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 02 Jun 2023 13:17:28 UTC
The branch stable/13 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=797e917ed6478832943a1c1dbec8913fc9ad4aa1
commit 797e917ed6478832943a1c1dbec8913fc9ad4aa1
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2023-05-26 19:13:20 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
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());
}