Skip to content

Commit c8cc2fd

Browse files
committed
Tests/Kernel: Add some W^X tests
1 parent a57cad6 commit c8cc2fd

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

Tests/Kernel/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ set(LIBTEST_BASED_SOURCES
6060
TestSigHandler.cpp
6161
TestSigWait.cpp
6262
TestTCPSocket.cpp
63+
TestWXProtection.cpp
6364
)
6465

6566
if (ENABLE_KERNEL_COVERAGE_COLLECTION)

Tests/Kernel/TestWXProtection.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright (c) 2025, Sönke Holz <[email protected]>
3+
*
4+
* SPDX-License-Identifier: BSD-2-Clause
5+
*/
6+
7+
#include <LibTest/TestCase.h>
8+
#include <fcntl.h>
9+
#include <sys/mman.h>
10+
11+
TEST_CASE(ax_protection)
12+
{
13+
// Anonymous executable mmaps should fail.
14+
void* p = mmap(nullptr, PAGE_SIZE, PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
15+
EXPECT_EQ(p, MAP_FAILED);
16+
EXPECT_EQ(errno, EINVAL);
17+
}
18+
19+
TEST_CASE(basic_wx_protection)
20+
{
21+
int fd = open("/bin/SystemServer", O_RDONLY);
22+
EXPECT_NE(fd, -1);
23+
24+
// Writable and executable mmaps should fail.
25+
void* p = mmap(nullptr, PAGE_SIZE, PROT_WRITE | PROT_EXEC, MAP_PRIVATE, fd, 0);
26+
EXPECT_EQ(p, MAP_FAILED);
27+
EXPECT_EQ(errno, EINVAL);
28+
}
29+
30+
TEST_CASE(advanced_wx_protection)
31+
{
32+
int fd = open("/bin/SystemServer", O_RDONLY);
33+
EXPECT_NE(fd, -1);
34+
35+
// Memory that was previously writable cannot become executable.
36+
void* p = mmap(nullptr, PAGE_SIZE, PROT_WRITE, MAP_PRIVATE, fd, 0);
37+
EXPECT_NE(p, MAP_FAILED);
38+
39+
EXPECT_EQ(mprotect(p, PAGE_SIZE, PROT_EXEC), -1);
40+
EXPECT_EQ(errno, EINVAL);
41+
42+
// Memory that was previously executable cannot become writable.
43+
p = mmap(nullptr, PAGE_SIZE, PROT_EXEC, MAP_PRIVATE, fd, 0);
44+
EXPECT_NE(p, MAP_FAILED);
45+
46+
EXPECT_EQ(mprotect(p, PAGE_SIZE, PROT_WRITE), -1);
47+
EXPECT_EQ(errno, EINVAL);
48+
}

0 commit comments

Comments
 (0)