zipos mmap only allow specific flags

This commit is contained in:
Gavin Hayes 2023-02-01 23:32:50 -05:00
parent 97f430335e
commit cb64ae5c75
2 changed files with 5 additions and 11 deletions

View file

@ -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;
}

View file

@ -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);
}