mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-08 19:00:27 +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,
|
void *__zipos_mmap(void *addr, size_t size, int prot, int flags,
|
||||||
struct ZiposHandle *h, int64_t off) {
|
struct ZiposHandle *h, int64_t off) {
|
||||||
if (VERY_UNLIKELY(!!(flags & MAP_ANONYMOUS))) {
|
if(!(flags & MAP_PRIVATE) || (flags & ~(MAP_PRIVATE | MAP_FILE | MAP_FIXED | MAP_FIXED_NOREPLACE)) ||
|
||||||
STRACE("MAP_ANONYMOUS zipos mismatch");
|
(!!(flags & MAP_FIXED) ^ !!(flags & MAP_FIXED_NOREPLACE))) {
|
||||||
|
STRACE("zipos mappings currently only support MAP_PRIVATE with select flags");
|
||||||
return VIP(einval());
|
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;
|
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) {
|
if (outAddr == MAP_FAILED) {
|
||||||
return MAP_FAILED;
|
return MAP_FAILED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -236,7 +236,7 @@ TEST(mmap, ziposCannotBeShared) {
|
||||||
int fd;
|
int fd;
|
||||||
void *p;
|
void *p;
|
||||||
ASSERT_NE(-1, (fd = open(ziposLifePath, O_RDONLY), "%s", ziposLifePath));
|
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)));
|
(p = mmap(NULL, 0x00010000, PROT_READ, MAP_SHARED, fd, 0)));
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue