Correctly handle MAP_FIXED with a zero address

This commit is contained in:
bjorn3
2025-12-09 23:09:19 +01:00
parent 5a11067f10
commit 3bf880e008
4 changed files with 13 additions and 4 deletions
+3 -1
View File
@@ -90,9 +90,11 @@ impl MemoryScheme {
return Err(Error::new(EOPNOTSUPP));
}
let fixed = map.flags.contains(MapFlags::MAP_FIXED) || map.flags.contains(MapFlags::MAP_FIXED_NOREPLACE);
let page = addr_space.acquire_write().mmap(
addr_space,
(map.address != 0).then_some(span.base),
(map.address != 0 || fixed).then_some(span.base),
page_count,
map.flags,
&mut notify_files,
+3 -1
View File
@@ -502,7 +502,9 @@ impl KernelScheme for ProcScheme {
PageSpan::validate_nonempty(VirtualAddress::new(map.offset), map.size)
.ok_or(Error::new(EINVAL))?;
let requested_dst_base = (map.address != 0).then_some(requested_dst_page);
let fixed = map.flags.contains(MapFlags::MAP_FIXED)
|| map.flags.contains(MapFlags::MAP_FIXED_NOREPLACE);
let requested_dst_base = (map.address != 0 || fixed).then_some(requested_dst_page);
let mut src_addr_space = addrspace.acquire_write();
+4 -1
View File
@@ -1234,7 +1234,10 @@ impl UserInner {
if map.address % PAGE_SIZE != 0 {
return Err(Error::new(EINVAL));
};
let dst_base = (map.address != 0)
let fixed = map.flags.contains(MapFlags::MAP_FIXED)
|| map.flags.contains(MapFlags::MAP_FIXED_NOREPLACE);
let dst_base = (map.address != 0 || fixed)
.then_some(Page::containing_address(VirtualAddress::new(map.address)));
if map.offset % PAGE_SIZE != 0 {
+3 -1
View File
@@ -744,7 +744,9 @@ pub fn mremap(
let addr_space = AddrSpace::current()?;
let src_span = PageSpan::new(old_base, old_size.div_ceil(PAGE_SIZE));
let new_page_count = new_size.div_ceil(PAGE_SIZE);
let requested_dst_base = Some(new_base).filter(|_| new_address != 0);
let fixed = map_flags.contains(MapFlags::MAP_FIXED)
|| map_flags.contains(MapFlags::MAP_FIXED_NOREPLACE);
let requested_dst_base = (new_address != 0 || fixed).then_some(new_base);
if mremap_flags.contains(MremapFlags::KEEP_OLD) {
// TODO: This is a hack! Find a better interface for replacing this, perhaps a capability