Add a test for PT_GET_SC_ARGS.
Reviewed by: kib MFC after: 1 month Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D20899
This commit is contained in:
parent
895d57ec60
commit
64ee41ff55
@ -3904,6 +3904,86 @@ ATF_TC_BODY(ptrace__PT_LWPINFO_stale_siginfo, tc)
|
||||
ATF_REQUIRE(errno == ECHILD);
|
||||
}
|
||||
|
||||
/*
|
||||
* A simple test of PT_GET_SC_ARGS.
|
||||
*/
|
||||
ATF_TC_WITHOUT_HEAD(ptrace__syscall_args);
|
||||
ATF_TC_BODY(ptrace__syscall_args, tc)
|
||||
{
|
||||
struct ptrace_lwpinfo pl;
|
||||
pid_t fpid, wpid;
|
||||
register_t args[2];
|
||||
int events, status;
|
||||
|
||||
ATF_REQUIRE((fpid = fork()) != -1);
|
||||
if (fpid == 0) {
|
||||
trace_me();
|
||||
kill(getpid(), 0);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* The first wait() should report the stop from SIGSTOP. */
|
||||
wpid = waitpid(fpid, &status, 0);
|
||||
ATF_REQUIRE(wpid == fpid);
|
||||
ATF_REQUIRE(WIFSTOPPED(status));
|
||||
ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP);
|
||||
|
||||
/*
|
||||
* Continue the process ignoring the signal, but enabling
|
||||
* syscall entry traps.
|
||||
*/
|
||||
ATF_REQUIRE(ptrace(PT_TO_SCE, fpid, (caddr_t)1, 0) == 0);
|
||||
|
||||
/*
|
||||
* The next stop should be the syscall entry from getpid().
|
||||
*/
|
||||
wpid = waitpid(fpid, &status, 0);
|
||||
ATF_REQUIRE(wpid == fpid);
|
||||
ATF_REQUIRE(WIFSTOPPED(status));
|
||||
ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP);
|
||||
|
||||
ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1);
|
||||
ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCE);
|
||||
ATF_REQUIRE(pl.pl_syscall_code == SYS_getpid);
|
||||
|
||||
ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0);
|
||||
|
||||
/*
|
||||
* The next stop should be the syscall entry from kill().
|
||||
*/
|
||||
wpid = waitpid(fpid, &status, 0);
|
||||
ATF_REQUIRE(wpid == fpid);
|
||||
ATF_REQUIRE(WIFSTOPPED(status));
|
||||
ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP);
|
||||
|
||||
ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1);
|
||||
ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCE);
|
||||
ATF_REQUIRE(pl.pl_syscall_code == SYS_kill);
|
||||
ATF_REQUIRE(pl.pl_syscall_narg == 2);
|
||||
|
||||
ATF_REQUIRE(ptrace(PT_GET_SC_ARGS, wpid, (caddr_t)args,
|
||||
sizeof(args)) != -1);
|
||||
ATF_REQUIRE(args[0] == wpid);
|
||||
ATF_REQUIRE(args[1] == 0);
|
||||
|
||||
/* Disable syscall tracing and continue the child to let it exit. */
|
||||
ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, fpid, (caddr_t)&events,
|
||||
sizeof(events)) == 0);
|
||||
events &= ~PTRACE_SYSCALL;
|
||||
ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, fpid, (caddr_t)&events,
|
||||
sizeof(events)) == 0);
|
||||
ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0);
|
||||
|
||||
/* The last event should be for the child process's exit. */
|
||||
wpid = waitpid(fpid, &status, 0);
|
||||
ATF_REQUIRE(WIFEXITED(status));
|
||||
ATF_REQUIRE(WEXITSTATUS(status) == 1);
|
||||
|
||||
wpid = wait(&status);
|
||||
ATF_REQUIRE(wpid == -1);
|
||||
ATF_REQUIRE(errno == ECHILD);
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
@ -3965,6 +4045,7 @@ ATF_TP_ADD_TCS(tp)
|
||||
ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_different_thread);
|
||||
#endif
|
||||
ATF_TP_ADD_TC(tp, ptrace__PT_LWPINFO_stale_siginfo);
|
||||
ATF_TP_ADD_TC(tp, ptrace__syscall_args);
|
||||
|
||||
return (atf_no_error());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user