Zeroize memory in munmap
1. Move the memory zeroization of mmap to munmap to increase mmap performance 2. Do memory zeroizaiton during the drop of VMManager to guarentee all allocated memory is zeroized before the next allocation
This commit is contained in:
parent
6ccd30ee3b
commit
1e456f025d
@ -11,6 +11,7 @@
|
||||
#![feature(alloc_layout_extra)]
|
||||
#![feature(concat_idents)]
|
||||
#![feature(trace_macros)]
|
||||
#![feature(slice_fill)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate alloc;
|
||||
|
@ -24,26 +24,18 @@ impl VMInitializer {
|
||||
// Do nothing
|
||||
}
|
||||
VMInitializer::FillZeros() => {
|
||||
for b in buf {
|
||||
*b = 0;
|
||||
}
|
||||
// Filling zero is done in munmap
|
||||
}
|
||||
VMInitializer::CopyFrom { range } => {
|
||||
let src_slice = unsafe { range.as_slice() };
|
||||
let copy_len = min(buf.len(), src_slice.len());
|
||||
buf[..copy_len].copy_from_slice(&src_slice[..copy_len]);
|
||||
for b in &mut buf[copy_len..] {
|
||||
*b = 0;
|
||||
}
|
||||
}
|
||||
VMInitializer::LoadFromFile { file, offset } => {
|
||||
// TODO: make sure that read_at does not move file cursor
|
||||
let len = file
|
||||
.read_at(*offset, buf)
|
||||
.cause_err(|_| errno!(EIO, "failed to init memory from file"))?;
|
||||
for b in &mut buf[len..] {
|
||||
*b = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
@ -341,6 +333,9 @@ impl VMManager {
|
||||
|
||||
// Reset memory permissions
|
||||
Self::apply_perms(&intersection_range, VMPerms::default());
|
||||
unsafe {
|
||||
intersection_range.as_slice_mut().fill(0);
|
||||
}
|
||||
|
||||
vma.subtract(&intersection_range)
|
||||
})
|
||||
@ -733,12 +728,18 @@ impl VMManager {
|
||||
|
||||
impl Drop for VMManager {
|
||||
fn drop(&mut self) {
|
||||
// Ensure that memory permissions are recovered
|
||||
// Ensure that all allocated memories are restored to the default permissions and zeroed
|
||||
for vma in &self.vmas {
|
||||
if vma.size() == 0 || vma.perms() == VMPerms::default() {
|
||||
continue;
|
||||
if vma.size() != 0 {
|
||||
warn!("There are unmapped memories");
|
||||
|
||||
if vma.perms() != VMPerms::default() {
|
||||
Self::apply_perms(vma, VMPerms::default());
|
||||
}
|
||||
unsafe {
|
||||
vma.as_slice_mut().fill(0);
|
||||
}
|
||||
}
|
||||
Self::apply_perms(vma, VMPerms::default());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user