0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "../kselftest_harness.h"
0011 #include <stdio.h>
0012 #include <fcntl.h>
0013 #include <pthread.h>
0014 #include <signal.h>
0015 #include <unistd.h>
0016 #include <sys/ptrace.h>
0017
0018 static void *thread(void *arg)
0019 {
0020 ptrace(PTRACE_TRACEME, 0, 0L, 0L);
0021 return NULL;
0022 }
0023
0024 TEST(vmaccess)
0025 {
0026 int f, pid = fork();
0027 char mm[64];
0028
0029 if (!pid) {
0030 pthread_t pt;
0031
0032 pthread_create(&pt, NULL, thread, NULL);
0033 pthread_join(pt, NULL);
0034 execlp("true", "true", NULL);
0035 }
0036
0037 sleep(1);
0038 sprintf(mm, "/proc/%d/mem", pid);
0039 f = open(mm, O_RDONLY);
0040 ASSERT_GE(f, 0);
0041 close(f);
0042 f = kill(pid, SIGCONT);
0043 ASSERT_EQ(f, 0);
0044 }
0045
0046 TEST(attach)
0047 {
0048 int s, k, pid = fork();
0049
0050 if (!pid) {
0051 pthread_t pt;
0052
0053 pthread_create(&pt, NULL, thread, NULL);
0054 pthread_join(pt, NULL);
0055 execlp("sleep", "sleep", "2", NULL);
0056 }
0057
0058 sleep(1);
0059 k = ptrace(PTRACE_ATTACH, pid, 0L, 0L);
0060 ASSERT_EQ(errno, EAGAIN);
0061 ASSERT_EQ(k, -1);
0062 k = waitpid(-1, &s, WNOHANG);
0063 ASSERT_NE(k, -1);
0064 ASSERT_NE(k, 0);
0065 ASSERT_NE(k, pid);
0066 ASSERT_EQ(WIFEXITED(s), 1);
0067 ASSERT_EQ(WEXITSTATUS(s), 0);
0068 sleep(1);
0069 k = ptrace(PTRACE_ATTACH, pid, 0L, 0L);
0070 ASSERT_EQ(k, 0);
0071 k = waitpid(-1, &s, 0);
0072 ASSERT_EQ(k, pid);
0073 ASSERT_EQ(WIFSTOPPED(s), 1);
0074 ASSERT_EQ(WSTOPSIG(s), SIGSTOP);
0075 k = ptrace(PTRACE_DETACH, pid, 0L, 0L);
0076 ASSERT_EQ(k, 0);
0077 k = waitpid(-1, &s, 0);
0078 ASSERT_EQ(k, pid);
0079 ASSERT_EQ(WIFEXITED(s), 1);
0080 ASSERT_EQ(WEXITSTATUS(s), 0);
0081 k = waitpid(-1, NULL, 0);
0082 ASSERT_EQ(k, -1);
0083 ASSERT_EQ(errno, ECHILD);
0084 }
0085
0086 TEST_HARNESS_MAIN