Add test for permission validation of mprotect and mmap

This commit is contained in:
Marsman1996 2026-01-26 16:46:23 +08:00 committed by Tate, Hongliang Tian
parent ea142155fb
commit 66ac28c4c2
1 changed files with 21 additions and 6 deletions

View File

@ -22,10 +22,10 @@ FN_TEST(mprotect_shared_writable_mapping_on_read_only_file)
fd = TEST_SUCC(open(filename, O_RDONLY)); fd = TEST_SUCC(open(filename, O_RDONLY));
char *addr = char *addr =
CHECK_WITH(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, 0), TEST_SUCC(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, 0));
_ret != MAP_FAILED);
TEST_ERRNO(mprotect(addr, PAGE_SIZE, PROT_READ | PROT_WRITE), EACCES); TEST_ERRNO(mprotect(addr, PAGE_SIZE, PROT_READ | PROT_WRITE), EACCES);
TEST_SUCC(munmap(addr, PAGE_SIZE));
TEST_SUCC(close(fd)); TEST_SUCC(close(fd));
TEST_SUCC(unlink(filename)); TEST_SUCC(unlink(filename));
} }
@ -38,11 +38,9 @@ FN_TEST(mprotect_private_writable_mapping_copy_on_write)
TEST_SUCC(write(fd, "AAAA", 5)); TEST_SUCC(write(fd, "AAAA", 5));
char *addr1 = char *addr1 =
CHECK_WITH(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0), TEST_SUCC(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0));
_ret != MAP_FAILED);
char *addr2 = char *addr2 =
CHECK_WITH(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0), TEST_SUCC(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0));
_ret != MAP_FAILED);
TEST_RES(strcmp(addr1, "AAAA"), _ret == 0); TEST_RES(strcmp(addr1, "AAAA"), _ret == 0);
TEST_RES(strcmp(addr2, "AAAA"), _ret == 0); TEST_RES(strcmp(addr2, "AAAA"), _ret == 0);
TEST_SUCC(mprotect(addr1, PAGE_SIZE, PROT_READ | PROT_WRITE)); TEST_SUCC(mprotect(addr1, PAGE_SIZE, PROT_READ | PROT_WRITE));
@ -50,7 +48,24 @@ FN_TEST(mprotect_private_writable_mapping_copy_on_write)
TEST_RES(strcmp(addr1, "BBBB"), _ret == 0); TEST_RES(strcmp(addr1, "BBBB"), _ret == 0);
TEST_RES(strcmp(addr2, "AAAA"), _ret == 0); TEST_RES(strcmp(addr2, "AAAA"), _ret == 0);
TEST_SUCC(munmap(addr1, PAGE_SIZE));
TEST_SUCC(munmap(addr2, PAGE_SIZE));
TEST_SUCC(close(fd)); TEST_SUCC(close(fd));
TEST_SUCC(unlink(filename)); TEST_SUCC(unlink(filename));
} }
END_TEST() END_TEST()
FN_TEST(mprotect_invalid_permission)
{
#define PROT_INVALID 0x20
void *addr = TEST_SUCC(mmap(NULL, PAGE_SIZE,
PROT_READ | PROT_WRITE | PROT_INVALID,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
TEST_SUCC(mprotect(addr, PAGE_SIZE, PROT_READ | PROT_EXEC));
TEST_ERRNO(mprotect(addr, PAGE_SIZE, PROT_READ | PROT_INVALID), EINVAL);
TEST_SUCC(munmap(addr, PAGE_SIZE));
}
END_TEST()