blob: 944c1a8902a6110e31f905eff418852dd6e19975 [file] [log] [blame]
Dmitry V. Levin1c5fead2015-02-23 22:37:40 +00001#include <fcntl.h>
Dmitry V. Levine96cb622015-02-15 15:52:02 +00002#include <unistd.h>
3#include <sys/mman.h>
4#include <sys/wait.h>
Dmitry V. Levin1c5fead2015-02-23 22:37:40 +00005#include <sys/sendfile.h>
Dmitry V. Levine96cb622015-02-15 15:52:02 +00006
7int main(void)
8{
9 const unsigned long size = sysconf(_SC_PAGESIZE);
Dmitry V. Levine96cb622015-02-15 15:52:02 +000010
11 /* write instruction pointer length to the log */
12 if (write(-1, NULL, 2 * sizeof(void *)) >= 0)
13 return 77;
Dmitry V. Levin1c5fead2015-02-23 22:37:40 +000014
Dmitry V. Levine96cb622015-02-15 15:52:02 +000015 /* just a noticeable line in the log */
Dmitry V. Levin1c5fead2015-02-23 22:37:40 +000016 if (munmap(&main, 0) >= 0)
Dmitry V. Levine96cb622015-02-15 15:52:02 +000017 return 77;
18
19 int pid = fork();
20 if (pid < 0)
21 return 77;
22
23 if (!pid) {
Dmitry V. Levin1c5fead2015-02-23 22:37:40 +000024 const unsigned long mask = ~(size - 1);
25 const unsigned long addr = (unsigned long) &main;
26
Dmitry V. Levine96cb622015-02-15 15:52:02 +000027 /* SIGSEGV is expected */
Dmitry V. Levin1c5fead2015-02-23 22:37:40 +000028 (void) munmap((void *) ((addr & mask) - size * 2), size * 4);
29 (void) munmap((void *) ((addr & mask) - size * 2), size * 4);
Dmitry V. Levine96cb622015-02-15 15:52:02 +000030 return 77;
31 }
32
33 int status;
34 if (wait(&status) != pid ||
35 !WIFSIGNALED(status) ||
36 WTERMSIG(status) != SIGSEGV)
37 return 77;
38
Dmitry V. Levin1c5fead2015-02-23 22:37:40 +000039 /* dump process map for debug purposes */
40 close(0);
41 if (!open("/proc/self/maps", O_RDONLY))
42 (void) sendfile(1, 0, NULL, size);
43
Dmitry V. Levine96cb622015-02-15 15:52:02 +000044 return 0;
45}