From 5a8c2201018a134528cf49480ed85fca54e28d7b Mon Sep 17 00:00:00 2001 From: Hediadyoin1 Date: Sat, 8 May 2021 11:08:50 +0200 Subject: [PATCH] Kernel: Add a test for multi-region mprotect --- .../Kernel/mprotect-multi-region-mrotect.cpp | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Tests/Kernel/mprotect-multi-region-mrotect.cpp diff --git a/Tests/Kernel/mprotect-multi-region-mrotect.cpp b/Tests/Kernel/mprotect-multi-region-mrotect.cpp new file mode 100644 index 0000000000..68308fd1ae --- /dev/null +++ b/Tests/Kernel/mprotect-multi-region-mrotect.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2021, the SerenityOS developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include +#include + +int main() +{ + printf("Testing full unnmap\n"); + auto* map1 = mmap(nullptr, 2 * PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, 0, 0); + if (map1 == MAP_FAILED) { + perror("mmap 1"); + return 1; + } + auto* map2 = mmap((void*)((FlatPtr)map1 + 2 * PAGE_SIZE), 2 * PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, 0, 0); + if (map2 == MAP_FAILED) { + perror("mmap 2"); + return 1; + } + auto* map3 = mmap((void*)((FlatPtr)map1 + 4 * PAGE_SIZE), 2 * PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, 0, 0); + if (map3 == MAP_FAILED) { + perror("mmap 3"); + return 1; + } + + // really allocating pages + memset(map1, 0x01, 6 * PAGE_SIZE); + + int rc; + + outln("Mprotect 3 ranges [2, 2 ,2]"); + rc = mprotect(map1, 6 * PAGE_SIZE, PROT_READ); + if (rc) { + perror("mprotect full"); + return 1; + } + + outln("Mprotect 3 ranges [-1, 2 ,1-]"); + rc = mprotect((void*)((FlatPtr)map1 + PAGE_SIZE), 4 * PAGE_SIZE, PROT_READ); + if (rc) { + perror("mprotect partial"); + return 1; + } + + outln("unmapping"); + munmap(map2, 2 * PAGE_SIZE); + + outln("Mprotect 2 ranges [2, -- ,2] -> Error"); + rc = mprotect(map1, 6 * PAGE_SIZE, PROT_READ); + if (!rc) { + perror("mprotect full over missing succeded"); + return 1; + } + + outln("Mprotect 3 ranges [-1, -- ,1-] -> Error"); + rc = mprotect((void*)((FlatPtr)map1 + PAGE_SIZE), 4 * PAGE_SIZE, PROT_READ); + if (!rc) { + perror("mprotect partial over missing succeeded"); + return 1; + } + + //cleanup + munmap(map1, 6 * PAGE_SIZE); + + outln("PASS"); + return 0; +}