From b4750c0fcd0831945cddbcb41c78a2cb61a98625 Mon Sep 17 00:00:00 2001 From: He Sun Date: Tue, 14 Jul 2020 10:32:12 +0800 Subject: [PATCH] Revert "Zeroize memory in munmap" This reverts commit 1e456f025d6b4e34a726180e7a27a04424fe79d1. This commit results in segmentation fault when the application munmaps its own stack. Should be committed back after removing the dependency of sysret on the user space stack. --- src/libos/src/lib.rs | 1 - src/libos/src/vm/vm_manager.rs | 27 +++++++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/libos/src/lib.rs b/src/libos/src/lib.rs index 174aff72..a6268e53 100644 --- a/src/libos/src/lib.rs +++ b/src/libos/src/lib.rs @@ -11,7 +11,6 @@ #![feature(alloc_layout_extra)] #![feature(concat_idents)] #![feature(trace_macros)] -#![feature(slice_fill)] #[macro_use] extern crate alloc; diff --git a/src/libos/src/vm/vm_manager.rs b/src/libos/src/vm/vm_manager.rs index 1fee8865..a0b7f642 100644 --- a/src/libos/src/vm/vm_manager.rs +++ b/src/libos/src/vm/vm_manager.rs @@ -24,18 +24,26 @@ impl VMInitializer { // Do nothing } VMInitializer::FillZeros() => { - // Filling zero is done in munmap + for b in buf { + *b = 0; + } } 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(()) @@ -333,9 +341,6 @@ impl VMManager { // Reset memory permissions Self::apply_perms(&intersection_range, VMPerms::default()); - unsafe { - intersection_range.as_slice_mut().fill(0); - } vma.subtract(&intersection_range) }) @@ -728,18 +733,12 @@ impl VMManager { impl Drop for VMManager { fn drop(&mut self) { - // Ensure that all allocated memories are restored to the default permissions and zeroed + // Ensure that memory permissions are recovered for vma in &self.vmas { - 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); - } + if vma.size() == 0 || vma.perms() == VMPerms::default() { + continue; } + Self::apply_perms(vma, VMPerms::default()); } } }