diff --git a/src/hostcalls.rs b/src/hostcalls.rs index 8f37f2ae..aa205182 100644 --- a/src/hostcalls.rs +++ b/src/hostcalls.rs @@ -21,12 +21,20 @@ extern "C" { fn proxy_log(level: LogLevel, message_data: *const u8, message_size: usize) -> Status; } +// Useful for the panic hook to avoid a double-panic. +#[inline] +pub(crate) fn log_nopanic(level: LogLevel, message: &str) -> Result { + let status = unsafe { proxy_log(level, message.as_ptr(), message.len()) }; + match status { + ok @ Status::Ok => Ok(ok), + unknown => Err(unknown), + } +} + pub fn log(level: LogLevel, message: &str) -> Result<(), Status> { - unsafe { - match proxy_log(level, message.as_ptr(), message.len()) { - Status::Ok => Ok(()), - status => panic!("unexpected status: {}", status as u32), - } + match log_nopanic(level, message) { + Ok(_) => Ok(()), + Err(status) => panic!("unexpected status: {}", status as u32), } } diff --git a/src/logger.rs b/src/logger.rs index 050a356d..c3619b2a 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -26,7 +26,7 @@ pub(crate) fn set_log_level(level: LogLevel) { if !INITIALIZED.load(Ordering::Relaxed) { log::set_logger(&LOGGER).unwrap(); panic::set_hook(Box::new(|panic_info| { - hostcalls::log(LogLevel::Critical, &panic_info.to_string()).unwrap(); + let _ = hostcalls::log_nopanic(LogLevel::Critical, &panic_info.to_string()); })); INITIALIZED.store(true, Ordering::Relaxed); }