diff --git a/test/initramfs/src/apps/mmap/mmap_and_mprotect.c b/test/initramfs/src/apps/mmap/mmap_and_mprotect.c index 4c5cf537e..50021e99c 100644 --- a/test/initramfs/src/apps/mmap/mmap_and_mprotect.c +++ b/test/initramfs/src/apps/mmap/mmap_and_mprotect.c @@ -22,10 +22,10 @@ FN_TEST(mprotect_shared_writable_mapping_on_read_only_file) fd = TEST_SUCC(open(filename, O_RDONLY)); char *addr = - CHECK_WITH(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, 0), - _ret != MAP_FAILED); + TEST_SUCC(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, 0)); TEST_ERRNO(mprotect(addr, PAGE_SIZE, PROT_READ | PROT_WRITE), EACCES); + TEST_SUCC(munmap(addr, PAGE_SIZE)); TEST_SUCC(close(fd)); TEST_SUCC(unlink(filename)); } @@ -38,11 +38,9 @@ FN_TEST(mprotect_private_writable_mapping_copy_on_write) TEST_SUCC(write(fd, "AAAA", 5)); char *addr1 = - CHECK_WITH(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0), - _ret != MAP_FAILED); + TEST_SUCC(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0)); char *addr2 = - CHECK_WITH(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0), - _ret != MAP_FAILED); + TEST_SUCC(mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0)); TEST_RES(strcmp(addr1, "AAAA"), _ret == 0); TEST_RES(strcmp(addr2, "AAAA"), _ret == 0); 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(addr2, "AAAA"), _ret == 0); + TEST_SUCC(munmap(addr1, PAGE_SIZE)); + TEST_SUCC(munmap(addr2, PAGE_SIZE)); TEST_SUCC(close(fd)); TEST_SUCC(unlink(filename)); } 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()