Skip to content

Commit 79b8523

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 6f62d06 commit 79b8523

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;
@@ -478,10 +478,10 @@ pub enum BuildMicrovmFromSnapshotError {
478478
/// Failed to load guest memory: {0}
479479
GuestMemory(#[from] BuildMicrovmFromSnapshotErrorGuestMemoryError),
480480
/// Userfault bitmap memfd error: {0}
481-
UserfaultBitmapMemfd(#[from] crate::vstate::memory::MemoryError),
481+
UserfaultBitmapMemfd(#[from] MemoryError),
482482
}
483483

484-
fn memfd_to_slice(memfd: &mut Option<File>) -> Option<&mut [u8]> {
484+
fn memfd_to_slice(memfd: &mut Option<File>) -> Result<Option<&mut [u8]>, MemoryError> {
485485
if let Some(bitmap_file) = memfd {
486486
let len = u64_to_usize(
487487
bitmap_file
@@ -503,16 +503,15 @@ fn memfd_to_slice(memfd: &mut Option<File>) -> Option<&mut [u8]> {
503503
};
504504

505505
if bitmap_addr == libc::MAP_FAILED {
506-
panic!(
507-
"Failed to mmap userfault bitmap file: {}",
508-
std::io::Error::last_os_error()
509-
);
506+
return Err(MemoryError::Mmap(std::io::Error::last_os_error()));
510507
}
511508

512509
// SAFETY: `bitmap_addr` is a valid memory address returned by `mmap`.
513-
Some(unsafe { std::slice::from_raw_parts_mut(bitmap_addr.cast(), len) })
510+
Ok(Some(unsafe {
511+
std::slice::from_raw_parts_mut(bitmap_addr.cast(), len)
512+
}))
514513
} else {
515-
None
514+
Ok(None)
516515
}
517516
}
518517
// TODO: take it from kvm-bindings when userfault support is merged upstream
@@ -610,7 +609,7 @@ pub fn build_microvm_from_snapshot(
610609
}
611610
};
612611

613-
let mut userfault_bitmap = memfd_to_slice(&mut userfault_bitmap_memfd);
612+
let mut userfault_bitmap = memfd_to_slice(&mut userfault_bitmap_memfd)?;
614613
if let Some(ref mut slice) = userfault_bitmap {
615614
// Set all bits so a fault on any page will cause a VM exit
616615
slice.fill(0xffu8);

src/vmm/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,7 @@ impl MutEventSubscriber for Vmm {
868868
if let Some(uffd_socket) = self.uffd_socket.as_ref()
869869
&& let Err(err) = ops.add(Events::new(uffd_socket, EventSet::IN))
870870
{
871-
panic!("Failed to register UFFD socket: {}", err);
871+
error!("Failed to register UFFD socket: {}", err);
872872
}
873873
}
874874
}

src/vmm/src/persist.rs

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

596596
let socket = UnixStream::connect(mem_uds_path)?;
597-
socket
598-
.set_nonblocking(true)
599-
.expect("Cannot set non-blocking");
597+
socket.set_nonblocking(true)?;
600598

601599
socket.send_with_fds(
602600
&[backend_mappings.as_bytes()],

0 commit comments

Comments
 (0)