mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-08 10:50:28 +00:00
zipos mmap only allow specific flags
This commit is contained in:
parent
97f430335e
commit
cb64ae5c75
2 changed files with 5 additions and 11 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue