From cb64ae5c75e7ae3d54c8438312e266fbec33b869 Mon Sep 17 00:00:00 2001 From: Gavin Hayes Date: Wed, 1 Feb 2023 23:32:50 -0500 Subject: [PATCH] zipos mmap only allow specific flags --- libc/zipos/mmap.c | 14 ++++---------- test/libc/runtime/mmap_test.c | 2 +- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/libc/zipos/mmap.c b/libc/zipos/mmap.c index f727edc0e..904821886 100644 --- a/libc/zipos/mmap.c +++ b/libc/zipos/mmap.c @@ -48,20 +48,14 @@ */ void *__zipos_mmap(void *addr, size_t size, int prot, int flags, struct ZiposHandle *h, int64_t off) { - if (VERY_UNLIKELY(!!(flags & MAP_ANONYMOUS))) { - STRACE("MAP_ANONYMOUS zipos mismatch"); + if(!(flags & MAP_PRIVATE) || (flags & ~(MAP_PRIVATE | MAP_FILE | MAP_FIXED | MAP_FIXED_NOREPLACE)) || + (!!(flags & MAP_FIXED) ^ !!(flags & MAP_FIXED_NOREPLACE))) { + STRACE("zipos mappings currently only support MAP_PRIVATE with select flags"); return VIP(einval()); } - // MAP_SHARED for non-writeable pages could be implemented, but would require - // keeping track of zipos pages to prevent mprotect(addr,len,PROT_WRITE) - if (VERY_UNLIKELY(!!(flags & MAP_SHARED))) { - STRACE("MAP_SHARED on zipos"); - return VIP(eacces()); - } - const int tempProt = !IsXnu() ? prot | PROT_WRITE : PROT_WRITE; - void *outAddr = mmap(addr, size, tempProt, flags | MAP_ANONYMOUS, -1, 0); + void *outAddr = mmap(addr, size, tempProt, (flags & (~MAP_FILE)) | MAP_ANONYMOUS, -1, 0); if (outAddr == MAP_FAILED) { return MAP_FAILED; } diff --git a/test/libc/runtime/mmap_test.c b/test/libc/runtime/mmap_test.c index 873bab8c0..746a273fc 100644 --- a/test/libc/runtime/mmap_test.c +++ b/test/libc/runtime/mmap_test.c @@ -236,7 +236,7 @@ TEST(mmap, ziposCannotBeShared) { int fd; void *p; ASSERT_NE(-1, (fd = open(ziposLifePath, O_RDONLY), "%s", ziposLifePath)); - EXPECT_SYS(EACCES, MAP_FAILED, + EXPECT_SYS(EINVAL, MAP_FAILED, (p = mmap(NULL, 0x00010000, PROT_READ, MAP_SHARED, fd, 0))); close(fd); }