]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-sigbus.c
tree-wide: remove Lennart's copyright lines
[thirdparty/systemd.git] / src / test / test-sigbus.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include <sys/mman.h>
4
5 #include "fd-util.h"
6 #include "sigbus.h"
7 #include "util.h"
8 #if HAVE_VALGRIND_VALGRIND_H
9 #include <valgrind/valgrind.h>
10 #endif
11
12 int main(int argc, char *argv[]) {
13 _cleanup_close_ int fd = -1;
14 char template[] = "/tmp/sigbus-test-XXXXXX";
15 void *addr = NULL;
16 uint8_t *p;
17
18 #if HAVE_VALGRIND_VALGRIND_H
19 if (RUNNING_ON_VALGRIND)
20 return EXIT_TEST_SKIP;
21 #endif
22
23 #ifdef __SANITIZE_ADDRESS__
24 return EXIT_TEST_SKIP;
25 #endif
26 sigbus_install();
27
28 assert_se(sigbus_pop(&addr) == 0);
29
30 assert_se((fd = mkostemp(template, O_RDWR|O_CREAT|O_EXCL)) >= 0);
31 assert_se(unlink(template) >= 0);
32 assert_se(posix_fallocate(fd, 0, page_size() * 8) >= 0);
33
34 p = mmap(NULL, page_size() * 16, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
35 assert_se(p != MAP_FAILED);
36
37 assert_se(sigbus_pop(&addr) == 0);
38
39 p[0] = 0xFF;
40 assert_se(sigbus_pop(&addr) == 0);
41
42 p[page_size()] = 0xFF;
43 assert_se(sigbus_pop(&addr) == 0);
44
45 p[page_size()*8] = 0xFF;
46 p[page_size()*8+1] = 0xFF;
47 p[page_size()*10] = 0xFF;
48 assert_se(sigbus_pop(&addr) > 0);
49 assert_se(addr == p + page_size() * 8);
50 assert_se(sigbus_pop(&addr) > 0);
51 assert_se(addr == p + page_size() * 10);
52 assert_se(sigbus_pop(&addr) == 0);
53
54 sigbus_reset();
55 }