1 | // RUN: %clangxx %s -o %t && %run %t %p |
2 | |
3 | #include <assert.h> |
4 | #include <errno.h> |
5 | #include <stdint.h> |
6 | #include <sys/mman.h> |
7 | #include <sys/prctl.h> |
8 | |
9 | #ifndef PR_SCHED_CORE |
10 | # define PR_SCHED_CORE 62 |
11 | #endif |
12 | |
13 | #ifndef PR_SCHED_CORE_CREATE |
14 | # define PR_SCHED_CORE_CREATE 1 |
15 | #endif |
16 | |
17 | #ifndef PR_SCHED_CORE_GET |
18 | # define PR_SCHED_CORE_GET 0 |
19 | #endif |
20 | |
21 | #ifndef PR_SET_VMA |
22 | # define PR_SET_VMA 0x53564d41 |
23 | # define PR_SET_VMA_ANON_NAME 0 |
24 | #endif |
25 | |
26 | int main() { |
27 | |
28 | int res; |
29 | res = prctl(PR_SCHED_CORE, PR_SCHED_CORE_CREATE, 0, 0, 0); |
30 | if (res < 0) { |
31 | assert(errno == EINVAL || errno == ENODEV); |
32 | return 0; |
33 | } |
34 | |
35 | uint64_t cookie = 0; |
36 | res = prctl(PR_SCHED_CORE, PR_SCHED_CORE_GET, 0, 0, &cookie); |
37 | if (res < 0) { |
38 | assert(errno == EINVAL); |
39 | } else { |
40 | assert(cookie != 0); |
41 | } |
42 | |
43 | char invname[81], vlname[] = "prctl" ; |
44 | for (auto i = 0; i < sizeof(invname); i++) { |
45 | invname[i] = 0x1e; |
46 | } |
47 | invname[80] = 0; |
48 | auto p = |
49 | mmap(addr: nullptr, len: 128, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, fd: -1, offset: 0); |
50 | assert(p != MAP_FAILED); |
51 | // regardless of kernel support, the name is invalid |
52 | res = prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, (uintptr_t)p, 128, |
53 | (uintptr_t)invname); |
54 | assert(res == -1); |
55 | assert(errno == EINVAL); |
56 | res = prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, (uintptr_t)p, 128, |
57 | (uintptr_t)vlname); |
58 | if (res < 0) { |
59 | assert(errno == EINVAL); |
60 | } |
61 | munmap(addr: p, len: 128); |
62 | |
63 | return 0; |
64 | } |
65 | |