1*053f45beSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0+
2*053f45beSAndroid Build Coastguard Worker /*
3*053f45beSAndroid Build Coastguard Worker * Copyright (c) 2020 Bernd Edlinger <[email protected]>
4*053f45beSAndroid Build Coastguard Worker * All rights reserved.
5*053f45beSAndroid Build Coastguard Worker *
6*053f45beSAndroid Build Coastguard Worker * Check whether /proc/$pid/mem can be accessed without causing deadlocks
7*053f45beSAndroid Build Coastguard Worker * when de_thread is blocked with ->cred_guard_mutex held.
8*053f45beSAndroid Build Coastguard Worker */
9*053f45beSAndroid Build Coastguard Worker
10*053f45beSAndroid Build Coastguard Worker #include "../kselftest_harness.h"
11*053f45beSAndroid Build Coastguard Worker #include <stdio.h>
12*053f45beSAndroid Build Coastguard Worker #include <fcntl.h>
13*053f45beSAndroid Build Coastguard Worker #include <pthread.h>
14*053f45beSAndroid Build Coastguard Worker #include <signal.h>
15*053f45beSAndroid Build Coastguard Worker #include <unistd.h>
16*053f45beSAndroid Build Coastguard Worker #include <sys/ptrace.h>
17*053f45beSAndroid Build Coastguard Worker
thread(void * arg)18*053f45beSAndroid Build Coastguard Worker static void *thread(void *arg)
19*053f45beSAndroid Build Coastguard Worker {
20*053f45beSAndroid Build Coastguard Worker ptrace(PTRACE_TRACEME, 0, 0L, 0L);
21*053f45beSAndroid Build Coastguard Worker return NULL;
22*053f45beSAndroid Build Coastguard Worker }
23*053f45beSAndroid Build Coastguard Worker
TEST(vmaccess)24*053f45beSAndroid Build Coastguard Worker TEST(vmaccess)
25*053f45beSAndroid Build Coastguard Worker {
26*053f45beSAndroid Build Coastguard Worker int f, pid = fork();
27*053f45beSAndroid Build Coastguard Worker char mm[64];
28*053f45beSAndroid Build Coastguard Worker
29*053f45beSAndroid Build Coastguard Worker if (!pid) {
30*053f45beSAndroid Build Coastguard Worker pthread_t pt;
31*053f45beSAndroid Build Coastguard Worker
32*053f45beSAndroid Build Coastguard Worker pthread_create(&pt, NULL, thread, NULL);
33*053f45beSAndroid Build Coastguard Worker pthread_join(pt, NULL);
34*053f45beSAndroid Build Coastguard Worker execlp("true", "true", NULL);
35*053f45beSAndroid Build Coastguard Worker }
36*053f45beSAndroid Build Coastguard Worker
37*053f45beSAndroid Build Coastguard Worker sleep(1);
38*053f45beSAndroid Build Coastguard Worker sprintf(mm, "/proc/%d/mem", pid);
39*053f45beSAndroid Build Coastguard Worker f = open(mm, O_RDONLY);
40*053f45beSAndroid Build Coastguard Worker ASSERT_GE(f, 0);
41*053f45beSAndroid Build Coastguard Worker close(f);
42*053f45beSAndroid Build Coastguard Worker f = kill(pid, SIGCONT);
43*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(f, 0);
44*053f45beSAndroid Build Coastguard Worker }
45*053f45beSAndroid Build Coastguard Worker
TEST(attach)46*053f45beSAndroid Build Coastguard Worker TEST(attach)
47*053f45beSAndroid Build Coastguard Worker {
48*053f45beSAndroid Build Coastguard Worker int s, k, pid = fork();
49*053f45beSAndroid Build Coastguard Worker
50*053f45beSAndroid Build Coastguard Worker if (!pid) {
51*053f45beSAndroid Build Coastguard Worker pthread_t pt;
52*053f45beSAndroid Build Coastguard Worker
53*053f45beSAndroid Build Coastguard Worker pthread_create(&pt, NULL, thread, NULL);
54*053f45beSAndroid Build Coastguard Worker pthread_join(pt, NULL);
55*053f45beSAndroid Build Coastguard Worker execlp("sleep", "sleep", "2", NULL);
56*053f45beSAndroid Build Coastguard Worker }
57*053f45beSAndroid Build Coastguard Worker
58*053f45beSAndroid Build Coastguard Worker sleep(1);
59*053f45beSAndroid Build Coastguard Worker k = ptrace(PTRACE_ATTACH, pid, 0L, 0L);
60*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(errno, EAGAIN);
61*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(k, -1);
62*053f45beSAndroid Build Coastguard Worker k = waitpid(-1, &s, WNOHANG);
63*053f45beSAndroid Build Coastguard Worker ASSERT_NE(k, -1);
64*053f45beSAndroid Build Coastguard Worker ASSERT_NE(k, 0);
65*053f45beSAndroid Build Coastguard Worker ASSERT_NE(k, pid);
66*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(WIFEXITED(s), 1);
67*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(WEXITSTATUS(s), 0);
68*053f45beSAndroid Build Coastguard Worker sleep(1);
69*053f45beSAndroid Build Coastguard Worker k = ptrace(PTRACE_ATTACH, pid, 0L, 0L);
70*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(k, 0);
71*053f45beSAndroid Build Coastguard Worker k = waitpid(-1, &s, 0);
72*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(k, pid);
73*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(WIFSTOPPED(s), 1);
74*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(WSTOPSIG(s), SIGSTOP);
75*053f45beSAndroid Build Coastguard Worker k = ptrace(PTRACE_DETACH, pid, 0L, 0L);
76*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(k, 0);
77*053f45beSAndroid Build Coastguard Worker k = waitpid(-1, &s, 0);
78*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(k, pid);
79*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(WIFEXITED(s), 1);
80*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(WEXITSTATUS(s), 0);
81*053f45beSAndroid Build Coastguard Worker k = waitpid(-1, NULL, 0);
82*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(k, -1);
83*053f45beSAndroid Build Coastguard Worker ASSERT_EQ(errno, ECHILD);
84*053f45beSAndroid Build Coastguard Worker }
85*053f45beSAndroid Build Coastguard Worker
86*053f45beSAndroid Build Coastguard Worker TEST_HARNESS_MAIN
87