check_vmflag_guard() uses /proc/self/smaps to retrieve the VMA flags,
but this can fail if the mapping is merged with an adjacent VMA.

To avoid this potential failure, first allocate a temporary region with
extra pages at both ends, unmap it, and then map the test region within
the temporary address range, leaving an unmapped page on each side to
prevent VMA merging.

Signed-off-by: Yeoreum Yun <[email protected]>
---
 tools/testing/selftests/mm/guard-regions.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/mm/guard-regions.c 
b/tools/testing/selftests/mm/guard-regions.c
index 5c8ec3ca75d7..a28a57d34e97 100644
--- a/tools/testing/selftests/mm/guard-regions.c
+++ b/tools/testing/selftests/mm/guard-regions.c
@@ -2257,8 +2257,18 @@ TEST_F(guard_regions, smaps)
        char *ptr, *ptr2;
        int i;
 
-       /* Map a region. */
-       ptr = mmap_(self, variant, NULL, 10 * page_size, PROT_READ | 
PROT_WRITE, 0, 0);
+       /* Try to Map a region. */
+       ptr = mmap_(self, variant, NULL, 12 * page_size, PROT_READ | 
PROT_WRITE, 0, 0);
+       ASSERT_NE(ptr, MAP_FAILED);
+       ASSERT_EQ(munmap(ptr, 12 * page_size), 0);
+
+       /*
+        * Map a region for the test. Since the preceding temporary mapping
+        * succeeded, this mapping should also succeed without merging with
+        * adjacent VMAs.
+        */
+       ptr = mmap_(self, variant, ptr + page_size, 10 * page_size,
+                   PROT_READ | PROT_WRITE, MAP_FIXED, 0);
        ASSERT_NE(ptr, MAP_FAILED);
 
        /* We shouldn't yet see a guard flag. */
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}


Reply via email to