aboutsummaryrefslogtreecommitdiff
path: root/tests/sys/vm/mmap_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/sys/vm/mmap_test.c')
-rw-r--r--tests/sys/vm/mmap_test.c70
1 files changed, 69 insertions, 1 deletions
diff --git a/tests/sys/vm/mmap_test.c b/tests/sys/vm/mmap_test.c
index e5f4a81a7858..6bc30f73ca95 100644
--- a/tests/sys/vm/mmap_test.c
+++ b/tests/sys/vm/mmap_test.c
@@ -295,14 +295,82 @@ ATF_TC_BODY(mmap__write_only, tc)
munmap(p, pagesize);
}
-ATF_TP_ADD_TCS(tp)
+ATF_TC_WITHOUT_HEAD(mmap__maxprot_basic);
+ATF_TC_BODY(mmap__maxprot_basic, tc)
+{
+ void *p;
+ int error, pagesize;
+
+ ATF_REQUIRE((pagesize = getpagesize()) > 0);
+
+ p = mmap(NULL, pagesize, PROT_READ | PROT_MAX(PROT_READ),
+ MAP_ANON, -1, 0);
+ ATF_REQUIRE(p != MAP_FAILED);
+
+ error = mprotect(p, pagesize, PROT_WRITE);
+ ATF_REQUIRE_ERRNO(EACCES, error == -1);
+ error = mprotect(p, pagesize, PROT_READ | PROT_WRITE);
+ ATF_REQUIRE_ERRNO(EACCES, error == -1);
+ error = mprotect(p, pagesize, PROT_READ | PROT_EXEC);
+ ATF_REQUIRE_ERRNO(EACCES, error == -1);
+
+ ATF_REQUIRE(munmap(p, pagesize) == 0);
+}
+
+/* Make sure that PROT_MAX applies as expected to mappings of shm objects */
+ATF_TC_WITHOUT_HEAD(mmap__maxprot_shm);
+ATF_TC_BODY(mmap__maxprot_shm, tc)
{
+ void *p;
+ int error, fd, pagesize;
+
+ ATF_REQUIRE((pagesize = getpagesize()) > 0);
+ fd = shm_open(SHM_ANON, O_RDWR, 0644);
+ ATF_REQUIRE(fd >= 0);
+
+ error = ftruncate(fd, pagesize);
+ ATF_REQUIRE(error == 0);
+
+ p = mmap(NULL, pagesize, PROT_READ | PROT_MAX(PROT_READ),
+ MAP_PRIVATE, fd, 0);
+ ATF_REQUIRE(p != MAP_FAILED);
+
+ error = mprotect(p, pagesize, PROT_WRITE);
+ ATF_REQUIRE_ERRNO(EACCES, error == -1);
+ error = mprotect(p, pagesize, PROT_READ | PROT_WRITE);
+ ATF_REQUIRE_ERRNO(EACCES, error == -1);
+ error = mprotect(p, pagesize, PROT_READ | PROT_EXEC);
+ ATF_REQUIRE_ERRNO(EACCES, error == -1);
+
+ ATF_REQUIRE(munmap(p, pagesize) == 0);
+
+ /* Again, this time with a shared mapping. */
+ p = mmap(NULL, pagesize, PROT_READ | PROT_MAX(PROT_READ),
+ MAP_SHARED, fd, 0);
+ ATF_REQUIRE(p != MAP_FAILED);
+
+ error = mprotect(p, pagesize, PROT_WRITE);
+ ATF_REQUIRE_ERRNO(EACCES, error == -1);
+ error = mprotect(p, pagesize, PROT_READ | PROT_WRITE);
+ ATF_REQUIRE_ERRNO(EACCES, error == -1);
+ error = mprotect(p, pagesize, PROT_READ | PROT_EXEC);
+ ATF_REQUIRE_ERRNO(EACCES, error == -1);
+
+ ATF_REQUIRE(munmap(p, pagesize) == 0);
+
+ ATF_REQUIRE(close(fd) == 0);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
ATF_TP_ADD_TC(tp, mmap__map_at_zero);
ATF_TP_ADD_TC(tp, mmap__bad_arguments);
ATF_TP_ADD_TC(tp, mmap__dev_zero_private);
ATF_TP_ADD_TC(tp, mmap__dev_zero_shared);
ATF_TP_ADD_TC(tp, mmap__write_only);
+ ATF_TP_ADD_TC(tp, mmap__maxprot_basic);
+ ATF_TP_ADD_TC(tp, mmap__maxprot_shm);
return (atf_no_error());
}