Lines Matching +full:signal +full:- +full:guard

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 #include <asm-generic/mman.h> /* Force the import of the tools version. */
11 #include <signal.h>
25 * "If the signal occurs other than as the result of calling the abort or raise
26 * function, the behavior is undefined if the signal handler refers to any
65 * Enable our signal catcher and try to read/write the specified buffer. The
67 * signal.
73 /* Tell signal handler to jump back here on fatal signal. */ in try_access_buf()
75 /* If a fatal signal arose, we will jump back here and failed is set. */ in try_access_buf()
89 /* Try and read from a buffer, return true if no fatal signal. */
95 /* Try and write to a buffer, return true if no fatal signal. */
126 self->page_size = (unsigned long)sysconf(_SC_PAGESIZE); in FIXTURE_SETUP()
143 const unsigned long page_size = self->page_size; in TEST_F()
148 MAP_PRIVATE | MAP_ANON, -1, 0); in TEST_F()
166 /* Establish a guard page at the end of the mapping. */ in TEST_F()
167 ASSERT_EQ(madvise(&ptr[(NUM_PAGES - 1) * page_size], page_size, in TEST_F()
170 /* Check that both guard pages result in SIGSEGV. */ in TEST_F()
172 ASSERT_FALSE(try_read_write_buf(&ptr[(NUM_PAGES - 1) * page_size])); in TEST_F()
174 /* Remove the first guard page. */ in TEST_F()
180 /* Remove the last guard page. */ in TEST_F()
181 ASSERT_FALSE(madvise(&ptr[(NUM_PAGES - 1) * page_size], page_size, in TEST_F()
185 ASSERT_TRUE(try_read_write_buf(&ptr[(NUM_PAGES - 1) * page_size])); in TEST_F()
189 * these be faulted in, so this also tests that we can install guard in TEST_F()
194 /* Make sure they are all guard pages. */ in TEST_F()
208 /* Remove guard pages. */ in TEST_F()
219 * Now remove all guard pages, make sure we don't remove existing in TEST_F()
236 const unsigned long page_size = self->page_size; in TEST_F()
242 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
247 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
253 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
259 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
270 * [---] [---] [---] in TEST_F()
274 * Now mark the whole range as guard pages and make sure all VMAs are as in TEST_F()
281 * -ENOMEM. Also if anything runs out of memory it is set to in TEST_F()
282 * -ENOMEM. You are meant to guess which is which. in TEST_F()
284 ASSERT_EQ(madvise(ptr_region, 100 * page_size, MADV_GUARD_INSTALL), -1); in TEST_F()
307 ASSERT_EQ(madvise(ptr_region, 100 * page_size, MADV_GUARD_REMOVE), -1); in TEST_F()
331 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
335 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
342 * [---][xxxx][---][xxxx][---] in TEST_F()
372 const unsigned long page_size = self->page_size; in TEST_F()
379 ASSERT_NE(pidfd, -1); in TEST_F()
383 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
393 MAP_FIXED | MAP_ANON | MAP_PRIVATE | MAP_POPULATE, -1, 0); in TEST_F()
395 /* We want guard markers at start/end of each VMA. */ in TEST_F()
404 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
414 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
427 /* Now guard in one step. */ in TEST_F()
431 if (count == -1 && errno == EPERM) in TEST_F()
469 /* Assert that unmapping ranges does not leave guard markers behind. */
472 const unsigned long page_size = self->page_size; in TEST_F()
476 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
479 /* Guard first and last pages. */ in TEST_F()
493 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
496 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
507 /* Assert that mprotect() operations have no bearing on guard markers. */
510 const unsigned long page_size = self->page_size; in TEST_F()
515 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
518 /* Guard the middle of the range. */ in TEST_F()
526 /* Now make these pages read-only. */ in TEST_F()
533 /* Make sure we can guard again without issue.*/ in TEST_F()
555 /* Split and merge VMAs and make sure guard pages still behave. */
558 const unsigned long page_size = self->page_size; in TEST_F()
563 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
566 /* Guard the whole range. */ in TEST_F()
581 /* Make sure the remaining ranges are guarded post-split. */ in TEST_F()
603 /* Now map them again - the unmap will have cleared the guards. */ in TEST_F()
605 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
608 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
611 MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
614 /* Now make sure guard pages are established. */ in TEST_F()
623 /* Now guard everything again. */ in TEST_F()
686 /* Assert that MADV_DONTNEED does not remove guard markers. */
689 const unsigned long page_size = self->page_size; in TEST_F()
694 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
704 /* Guard every other page. */ in TEST_F()
715 /* Check to ensure guard markers are still in place. */ in TEST_F()
739 /* Assert that mlock()'ed pages work correctly with guard markers. */
742 const unsigned long page_size = self->page_size; in TEST_F()
747 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
760 /* Now try to guard, should fail with EINVAL. */ in TEST_F()
761 ASSERT_EQ(madvise(ptr, 10 * page_size, MADV_GUARD_INSTALL), -1); in TEST_F()
767 /* Guard first half of range, should now succeed. */ in TEST_F()
770 /* Make sure guard works. */ in TEST_F()
784 * Now lock the latter part of the range. We can't lock the guard pages, in TEST_F()
791 * Now remove guard pages, we permit mlock()'d ranges to have guard in TEST_F()
792 * pages removed as it is a non-destructive operation. in TEST_F()
796 /* Now check that no guard pages remain. */ in TEST_F()
809 * guard markers where possible.
811 * - Moving a mapping alone should retain markers as they are.
815 const unsigned long page_size = self->page_size; in TEST_F()
820 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
823 /* Place guard markers at both ends of the 5 page span. */ in TEST_F()
827 /* Make sure the guard pages are in effect. */ in TEST_F()
835 -1, 0); in TEST_F()
841 /* Make sure the guard markers are retained. */ in TEST_F()
846 * Clean up - we only need reference the new pointer as we overwrote the in TEST_F()
854 * guard markers where possible.
856 * Expanding should retain guard pages, only now in different position. The user
857 * will have to remove guard pages manually to fix up (they'd have to do the
862 const unsigned long page_size = self->page_size; in TEST_F()
867 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
872 /* Place guard markers at both ends of the 5 page span. */ in TEST_F()
885 * Make sure the guard markers are retained in their original positions. in TEST_F()
892 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
901 * Again, make sure the guard markers are retained in their original positions. in TEST_F()
907 * A real user would have to remove guard markers, but would reasonably in TEST_F()
909 * guard markers. in TEST_F()
917 * guard markers where possible.
925 const unsigned long page_size = self->page_size; in TEST_F()
931 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
934 /* Place guard markers at both ends of the 5 page span. */ in TEST_F()
946 /* We expect the guard marker at the start to be retained... */ in TEST_F()
949 /* ...But remaining pages will not have guard markers. */ in TEST_F()
957 * As with expansion, a real user would have to remove guard pages and in TEST_F()
969 /* Again, we expect the guard marker at the start to be retained... */ in TEST_F()
972 /* ...But remaining pages will not have guard markers. */ in TEST_F()
985 * retain guard pages.
989 const unsigned long page_size = self->page_size; in TEST_F()
996 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
999 /* Establish guard pages in the first 5 pages. */ in TEST_F()
1003 ASSERT_NE(pid, -1); in TEST_F()
1040 * and then guard and unguard the range.
1044 const unsigned long page_size = self->page_size; in TEST_F()
1051 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
1062 ASSERT_NE(pid, -1); in TEST_F()
1074 /* Establish guard pages across the whole range. */ in TEST_F()
1080 * By removing the guard pages, the page tables will be in TEST_F()
1115 const unsigned long page_size = self->page_size; in TEST_F()
1122 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
1128 /* Guard the first 5 pages. */ in TEST_F()
1132 ASSERT_NE(pid, -1); in TEST_F()
1136 /* Guard will have been wiped. */ in TEST_F()
1150 /* Guard markers should be in effect.*/ in TEST_F()
1162 /* Ensure that MADV_FREE retains guard entries as expected. */
1165 const unsigned long page_size = self->page_size; in TEST_F()
1171 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
1174 /* Guard range. */ in TEST_F()
1187 /* This should leave the guard markers in place. */ in TEST_F()
1201 const unsigned long page_size = self->page_size; in TEST_F()
1206 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
1209 /* Guard range. */ in TEST_F()
1213 ASSERT_EQ(madvise(ptr, 10 * page_size, MADV_POPULATE_READ), -1); in TEST_F()
1217 ASSERT_EQ(madvise(ptr, 10 * page_size, MADV_POPULATE_WRITE), -1); in TEST_F()
1224 /* Ensure that MADV_COLD, MADV_PAGEOUT do not remove guard markers. */
1227 const unsigned long page_size = self->page_size; in TEST_F()
1233 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
1236 /* Guard range. */ in TEST_F()
1246 /* Now mark cold. This should have no impact on guard markers. */ in TEST_F()
1270 /* Ensure that guard pages do not break userfaultd. */
1273 const unsigned long page_size = self->page_size; in TEST_F()
1286 if (uffd == -1 && errno == EPERM) in TEST_F()
1288 ASSERT_NE(uffd, -1); in TEST_F()
1294 MAP_ANON | MAP_PRIVATE, -1, 0); in TEST_F()
1304 /* Guard the range. This should not trigger the uffd. */ in TEST_F()