Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 /*
0003  * Copyright (c) 2020 Bernd Edlinger <bernd.edlinger@hotmail.de>
0004  * All rights reserved.
0005  *
0006  * Check whether /proc/$pid/mem can be accessed without causing deadlocks
0007  * when de_thread is blocked with ->cred_guard_mutex held.
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