Skip to content

Commit 0a466e9

Browse files
committed
fix(vmm): propagate errors in secret freedom
Return errors up the stack instead of panicking. Signed-off-by: Nikita Kalyazin <kalyazin@amazon.com>
1 parent 9c2ef7e commit 0a466e9

File tree

4 files changed

+15
-14
lines changed

4 files changed

+15
-14
lines changed

src/vmm/src/builder.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ use crate::vmm_config::machine_config::MachineConfigError;
5959
use crate::vmm_config::memory_hotplug::MemoryHotplugConfig;
6060
use crate::vmm_config::snapshot::{LoadSnapshotParams, MemBackendType};
6161
use crate::vstate::kvm::{Kvm, KvmError};
62-
use crate::vstate::memory::{GuestMemoryState, MaybeBounce, bitmap_size, create_memfd};
62+
use crate::vstate::memory::{
63+
GuestMemoryState, MaybeBounce, MemoryError, bitmap_size, create_memfd,
64+
};
6365
#[cfg(target_arch = "aarch64")]
6466
use crate::vstate::resources::ResourceAllocator;
6567
use crate::vstate::vcpu::VcpuError;
@@ -517,10 +519,10 @@ pub enum BuildMicrovmFromSnapshotError {
517519
/// Failed to load guest memory: {0}
518520
GuestMemory(#[from] BuildMicrovmFromSnapshotErrorGuestMemoryError),
519521
/// Userfault bitmap memfd error: {0}
520-
UserfaultBitmapMemfd(#[from] crate::vstate::memory::MemoryError),
522+
UserfaultBitmapMemfd(#[from] MemoryError),
521523
}
522524

523-
fn memfd_to_slice(memfd: &mut Option<File>) -> Option<&mut [u8]> {
525+
fn memfd_to_slice(memfd: &mut Option<File>) -> Result<Option<&mut [u8]>, MemoryError> {
524526
if let Some(bitmap_file) = memfd {
525527
let len = u64_to_usize(
526528
bitmap_file
@@ -542,16 +544,15 @@ fn memfd_to_slice(memfd: &mut Option<File>) -> Option<&mut [u8]> {
542544
};
543545

544546
if bitmap_addr == libc::MAP_FAILED {
545-
panic!(
546-
"Failed to mmap userfault bitmap file: {}",
547-
std::io::Error::last_os_error()
548-
);
547+
return Err(MemoryError::Mmap(std::io::Error::last_os_error()));
549548
}
550549

551550
// SAFETY: `bitmap_addr` is a valid memory address returned by `mmap`.
552-
Some(unsafe { std::slice::from_raw_parts_mut(bitmap_addr.cast(), len) })
551+
Ok(Some(unsafe {
552+
std::slice::from_raw_parts_mut(bitmap_addr.cast(), len)
553+
}))
553554
} else {
554-
None
555+
Ok(None)
555556
}
556557
}
557558

@@ -656,7 +657,7 @@ pub fn build_microvm_from_snapshot(
656657
}
657658
};
658659

659-
let mut userfault_bitmap_slice = memfd_to_slice(&mut userfault_bitmap_memfd);
660+
let mut userfault_bitmap_slice = memfd_to_slice(&mut userfault_bitmap_memfd)?;
660661
if let Some(ref mut slice) = userfault_bitmap_slice {
661662
// Set all bits so a fault on any page will cause a VM exit
662663
slice.fill(0xffu8);

src/vmm/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,7 @@ impl MutEventSubscriber for Vmm {
923923
if let Some(uffd_socket) = self.uffd_socket.as_ref()
924924
&& let Err(err) = ops.add(Events::new(uffd_socket, EventSet::IN))
925925
{
926-
panic!("Failed to register UFFD socket: {}", err);
926+
error!("Failed to register UFFD socket: {}", err);
927927
}
928928
}
929929
}

src/vmm/src/persist.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -627,9 +627,7 @@ fn send_uffd_handshake(
627627
let backend_mappings = serde_json::to_string(backend_mappings).unwrap();
628628

629629
let socket = UnixStream::connect(mem_uds_path)?;
630-
socket
631-
.set_nonblocking(true)
632-
.expect("Cannot set non-blocking");
630+
socket.set_nonblocking(true)?;
633631

634632
socket.send_with_fds(
635633
&[backend_mappings.as_bytes()],

src/vmm/src/vstate/memory.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ pub enum MemoryError {
6464
Unaligned,
6565
/// Error protecting memory slot: {0}
6666
Mprotect(std::io::Error),
67+
/// Error calling mmap: {0}
68+
Mmap(std::io::Error),
6769
}
6870

6971
/// Type of the guest region

0 commit comments

Comments
 (0)