1 | #include <signal.h> |
2 | #include <unistd.h> |
3 | #include <stdlib.h> |
4 | #include <sys/mman.h> |
5 | #include <stdio.h> |
6 | #include <mach/mach.h> |
7 | #include <mach/mach_vm.h> |
8 | |
9 | int *g_int_ptr = NULL; |
10 | size_t g_size = 10*sizeof(int); |
11 | |
12 | void |
13 | saction_handler(int signo, siginfo_t info, void *baton) { |
14 | printf(format: "Got into handler.\n" ); // stop here in the signal handler |
15 | kern_return_t success |
16 | = mach_vm_protect(mach_task_self(), (mach_vm_address_t) g_int_ptr, |
17 | g_size, 0, VM_PROT_READ|VM_PROT_WRITE); |
18 | g_int_ptr[1] = 20; |
19 | } |
20 | int |
21 | main() |
22 | { |
23 | kern_return_t vm_result = vm_allocate(mach_task_self(), &g_int_ptr, g_size, VM_FLAGS_ANYWHERE); |
24 | for (int i = 0; i < 10; i++) |
25 | g_int_ptr[i] = i * 10; |
26 | |
27 | vm_result = mach_vm_protect(mach_task_self(), (mach_vm_address_t) g_int_ptr, g_size, 0, VM_PROT_NONE); |
28 | struct sigaction my_action; |
29 | sigemptyset(set: &my_action.sa_mask); |
30 | my_action.sa_handler = (void (*)(int)) saction_handler; |
31 | my_action.sa_flags = SA_SIGINFO; |
32 | |
33 | sigaction(SIGBUS, act: &my_action, NULL); // Stop here to get things going. |
34 | int local_value = g_int_ptr[1]; |
35 | return local_value; // Break here to make sure we got past the signal handler |
36 | } |
37 | |