Skip to content
Snippets Groups Projects
Commit dbfc8ab1 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Merge branch 'no_mprotect_crashes' into 'master'

Don't panic on mprotect for unmapped pages

See merge request redox-os/kernel!134
parents 92cad589 7b76ab33
Branches master
No related tags found
No related merge requests found
...@@ -1316,30 +1316,39 @@ pub fn mprotect(address: usize, size: usize, flags: MapFlags) -> Result<usize> { ...@@ -1316,30 +1316,39 @@ pub fn mprotect(address: usize, size: usize, flags: MapFlags) -> Result<usize> {
let start_page = Page::containing_address(VirtualAddress::new(address)); let start_page = Page::containing_address(VirtualAddress::new(address));
let end_page = Page::containing_address(VirtualAddress::new(end_address)); let end_page = Page::containing_address(VirtualAddress::new(end_address));
for page in Page::range_inclusive(start_page, end_page) { for page in Page::range_inclusive(start_page, end_page) {
if let Some(mut page_flags) = active_table.translate_page_flags(page) { // Check if the page is actually mapped before trying to change the flags.
if flags.contains(PROT_EXEC) { // FIXME can other processes change if a page is mapped beneath our feet?
page_flags.remove(EntryFlags::NO_EXECUTE); let mut page_flags = if let Some(page_flags) = active_table.translate_page_flags(page) {
} else { page_flags
page_flags.insert(EntryFlags::NO_EXECUTE); } else {
} flush_all.flush(&mut active_table);
return Err(Error::new(EFAULT));
};
if !page_flags.contains(EntryFlags::PRESENT) {
flush_all.flush(&mut active_table);
return Err(Error::new(EFAULT));
}
if flags.contains(PROT_WRITE) { if flags.contains(PROT_EXEC) {
//TODO: Not allowing gain of write privileges page_flags.remove(EntryFlags::NO_EXECUTE);
} else { } else {
page_flags.remove(EntryFlags::WRITABLE); page_flags.insert(EntryFlags::NO_EXECUTE);
} }
if flags.contains(PROT_READ) { if flags.contains(PROT_WRITE) {
//TODO: No flags for readable pages //TODO: Not allowing gain of write privileges
} else { } else {
//TODO: No flags for readable pages page_flags.remove(EntryFlags::WRITABLE);
} }
let flush = active_table.remap(page, page_flags); if flags.contains(PROT_READ) {
flush_all.consume(flush); //TODO: No flags for readable pages
} else { } else {
return Err(Error::new(EFAULT)); //TODO: No flags for readable pages
} }
let flush = active_table.remap(page, page_flags);
flush_all.consume(flush);
} }
flush_all.flush(&mut active_table); flush_all.flush(&mut active_table);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment