From d64a77a5c6f57ff5099c40b11b7b9f83c4942218 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Wed, 8 Sep 2021 15:35:52 +0100 Subject: [PATCH] vmm: Shutdown VMM if signal thread panics See: #3031 Signed-off-by: Rob Bradford --- vmm/src/vm.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index b4a667ce3..6a1875fd9 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -63,6 +63,7 @@ use std::io::{self, Read, Write}; use std::io::{Seek, SeekFrom}; use std::num::Wrapping; use std::ops::Deref; +use std::panic::AssertUnwindSafe; use std::sync::{Arc, Mutex, RwLock}; use std::{result, str, thread}; use vm_device::Bus; @@ -1592,7 +1593,7 @@ impl Vm { mut signals: Signals, console_input_clone: Arc, on_tty: bool, - exit_evt: EventFd, + exit_evt: &EventFd, ) { for sig in HANDLED_SIGNALS { unblock_signal(sig).unwrap(); @@ -1820,11 +1821,18 @@ impl Vm { .map_err(Error::ApplySeccompFilter) { error!("Error applying seccomp filter: {:?}", e); + exit_evt.write(1).ok(); return; } } - - Vm::os_signal_handler(signals, console, on_tty, exit_evt); + std::panic::catch_unwind(AssertUnwindSafe(|| { + Vm::os_signal_handler(signals, console, on_tty, &exit_evt); + })) + .map_err(|_| { + error!("signal_handler thead panicked"); + exit_evt.write(1).ok() + }) + .ok(); }) .map_err(Error::SignalHandlerSpawn)?, );