1 /*
2 * Check decoding of prctl PR_SET_PTRACER operation.
3 *
4 * Copyright (c) 2021 Eugene Syromyatnikov <evgsyr@gmail.com>
5 * All rights reserved.
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10 #include "tests.h"
11 #include "scno.h"
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <unistd.h>
16 #include <linux/prctl.h>
17
18 #include "pidns.h"
19
20
21 int
22 main(int argc, char *argv[])
23 {
24 PIDNS_TEST_INIT;
25
26 long rc;
27 unsigned long num_skip = 256;
28 bool locked = false;
29
30 if (argc >= 2)
31 num_skip = strtoul(argv[1], NULL, 0);
32
33 for (size_t i = 0; i < num_skip; i++) {
34 rc = prctl_marker();
35 #ifdef PIDNS_TRANSLATION
36 const char *errstr = sprintrc(rc);
37 pidns_print_leader();
38 printf("prctl(" XLAT_UNKNOWN(0xffffffff, "PR_???")
39 ", 0xfffffffe, 0xfffffffd, 0xfffffffc, 0xfffffffb) = ");
40
41 if (rc < 0) {
42 puts(errstr);
43 } else {
44 printf("%ld (INJECTED)\n", rc);
45 }
46 #endif
47
48 if (rc < 0)
49 continue;
50
51 locked = true;
52 break;
53 }
54
55 rc = syscall(__NR_prctl, PR_SET_PTRACER, F8ILL_KULONG_MASK,
56 0xdead, 0xface, 0xbeef);
57 pidns_print_leader();
58 printf("prctl(" XLAT_KNOWN(0x59616d61, "PR_SET_PTRACER")
59 ", 0) = %s%s\n", sprintrc(rc), locked ? " (INJECTED)" : "");
60
61 rc = syscall(__NR_prctl, PR_SET_PTRACER,
62 (kernel_ulong_t) 0xbadc0dedffffffffULL,
63 0xdead, 0xface, 0xbeef);
64 pidns_print_leader();
65 printf("prctl(" XLAT_KNOWN(0x59616d61, "PR_SET_PTRACER") ", "
66 XLAT_KNOWN(-1, "PR_SET_PTRACER_ANY") ") = %s%s\n",
67 sprintrc(rc), locked ? " (INJECTED)" : "");
68
69 const int pid = getpid();
70 const char *pid_str = pidns_pid2str(PT_TGID);
71 rc = syscall(__NR_prctl, PR_SET_PTRACER, F8ILL_KULONG_MASK | pid,
72 0xdead, 0xface, 0xbeef);
73 pidns_print_leader();
74 printf("prctl(" XLAT_KNOWN(0x59616d61, "PR_SET_PTRACER") ", %d%s)"
75 " = %s%s\n",
76 pid, pid_str, sprintrc(rc), locked ? " (INJECTED)" : "");
77
78 pidns_print_leader();
79 puts("+++ exited with 0 +++");
80 return 0;
81 }