Skip to content

Commit 68f3557

Browse files
kalyazinroypat
authored andcommitted
fix(vmm): propagate errors in secret freedom
Return errors up the stack instead of panicking. Signed-off-by: Nikita Kalyazin <[email protected]>
1 parent ab33fff commit 68f3557

File tree

3 files changed

+11
-14
lines changed

3 files changed

+11
-14
lines changed

src/vmm/src/builder.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ use crate::vmm_config::instance_info::InstanceInfo;
5757
use crate::vmm_config::machine_config::MachineConfigError;
5858
use crate::vmm_config::snapshot::{LoadSnapshotParams, MemBackendType};
5959
use crate::vstate::kvm::{Kvm, KvmError};
60-
use crate::vstate::memory::{MaybeBounce, create_memfd};
60+
use crate::vstate::memory::{MaybeBounce, create_memfd, MemoryError};
6161
#[cfg(target_arch = "aarch64")]
6262
use crate::vstate::resources::ResourceAllocator;
6363
use crate::vstate::vcpu::VcpuError;
@@ -469,10 +469,10 @@ pub enum BuildMicrovmFromSnapshotError {
469469
/// Failed to load guest memory: {0}
470470
GuestMemory(#[from] BuildMicrovmFromSnapshotErrorGuestMemoryError),
471471
/// Userfault bitmap memfd error: {0}
472-
UserfaultBitmapMemfd(#[from] crate::vstate::memory::MemoryError),
472+
UserfaultBitmapMemfd(#[from] MemoryError),
473473
}
474474

475-
fn memfd_to_slice(memfd: &Option<File>) -> Option<&mut [u8]> {
475+
fn memfd_to_slice(memfd: &Option<File>) -> Result<Option<&mut [u8]>, MemoryError> {
476476
if let Some(bitmap_file) = memfd {
477477
let len = u64_to_usize(
478478
bitmap_file
@@ -494,16 +494,15 @@ fn memfd_to_slice(memfd: &Option<File>) -> Option<&mut [u8]> {
494494
};
495495

496496
if bitmap_addr == libc::MAP_FAILED {
497-
panic!(
498-
"Failed to mmap userfault bitmap file: {}",
499-
std::io::Error::last_os_error()
500-
);
497+
return Err(MemoryError::Mmap(std::io::Error::last_os_error()));
501498
}
502499

503500
// SAFETY: `bitmap_addr` is a valid memory address returned by `mmap`.
504-
Some(unsafe { std::slice::from_raw_parts_mut(bitmap_addr.cast(), len) })
501+
Ok(Some(unsafe {
502+
std::slice::from_raw_parts_mut(bitmap_addr.cast(), len)
503+
}))
505504
} else {
506-
None
505+
Ok(None)
507506
}
508507
}
509508
// TODO: take it from kvm-bindings when userfault support is merged upstream
@@ -601,7 +600,7 @@ pub fn build_microvm_from_snapshot(
601600
}
602601
};
603602

604-
let mut userfault_bitmap = memfd_to_slice(&userfault_bitmap_memfd);
603+
let mut userfault_bitmap = memfd_to_slice(&userfault_bitmap_memfd)?;
605604
if let Some(ref mut slice) = userfault_bitmap {
606605
// Set all bits so a fault on any page will cause a VM exit
607606
slice.fill(0xffu8);

src/vmm/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ impl MutEventSubscriber for Vmm {
947947

948948
if let Some(uffd_socket) = self.uffd_socket.as_ref() {
949949
if let Err(err) = ops.add(Events::new(uffd_socket, EventSet::IN)) {
950-
panic!("Failed to register UFFD socket: {}", err);
950+
error!("Failed to register UFFD socket: {}", err);
951951
}
952952
}
953953
}

src/vmm/src/persist.rs

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

603603
let socket = UnixStream::connect(mem_uds_path)?;
604-
socket
605-
.set_nonblocking(true)
606-
.expect("Cannot set non-blocking");
604+
socket.set_nonblocking(true)?;
607605

608606
socket.send_with_fds(
609607
&[backend_mappings.as_bytes()],

0 commit comments

Comments
 (0)