1 /*
2 * Check decoding of SEGV_PKUERR.
3 *
4 * Copyright (c) 2022 Dmitry V. Levin <ldv@strace.io>
5 * All rights reserved.
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10 #include "tests.h"
11 #include <signal.h>
12
13 #if defined HAVE_SIGINFO_T_SI_PKEY && defined SEGV_PKUERR
14
15 # include <stdio.h>
16 # include <stdlib.h>
17 # include <unistd.h>
18 # include <sys/mman.h>
19
20 static void
21 handler(int sig, siginfo_t *info, void *ucontext)
22 {
23 if (info->si_code != SEGV_PKUERR)
24 error_msg_and_skip("SIGSEGV: si_code = %d", info->si_code);
25
26 printf("--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_PKUERR"
27 ", si_addr=%p, si_pkey=%u} ---\n",
28 info->si_addr, info->si_pkey);
29 exit(0);
30 }
31
32 int
33 main(void) {
34 int *p = mmap(NULL, get_page_size(), PROT_EXEC,
35 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
36 if (p == MAP_FAILED)
37 perror_msg_and_fail("mmap");
38
39 const struct sigaction act = {
40 .sa_sigaction = handler,
41 .sa_flags = SA_SIGINFO | SA_RESETHAND
42 };
43 if (sigaction(SIGSEGV, &act, NULL))
44 perror_msg_and_fail("sigaction");
45
46 __asm__ volatile("":: "r" (*p));
47
48 error_msg_and_skip("PROT_EXEC page is readable");
49 }
50
51 #else
52
53 SKIP_MAIN_UNDEFINED("HAVE_SIGINFO_T_SI_PKEY && SEGV_PKUERR")
54
55 #endif