From 400837ff992172bb09bab4d42bc0c918506a5e78 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Mon, 27 May 2024 08:23:07 +0000 Subject: [PATCH] vmm: wrap a new fd in UnixListener in serial manager The original code gave an owned fd to UnixListener. That made the same fd wrapped into two owned files. When the files were dropped, the same fd would be closed more than once. A newly introduced check in Rust's stdlib caught that error. A newly cloned fd should be given to UnixListener. Fixes: #6485 Signed-off-by: Wei Liu --- vmm/src/serial_manager.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vmm/src/serial_manager.rs b/vmm/src/serial_manager.rs index c1fef8a68..763e6bfae 100644 --- a/vmm/src/serial_manager.rs +++ b/vmm/src/serial_manager.rs @@ -274,8 +274,10 @@ impl SerialManager { let mut in_file = self.in_file.try_clone().map_err(Error::FileClone)?; let serial = self.serial.clone(); let pty_write_out = self.pty_write_out.clone(); - //SAFETY: in_file is has a valid fd - let listener = unsafe { UnixListener::from_raw_fd(self.in_file.as_raw_fd()) }; + // SAFETY: from_raw_fd is always called with a valid fd + let listener = unsafe { + UnixListener::from_raw_fd(in_file.try_clone().map_err(Error::FileClone)?.into_raw_fd()) + }; let mut reader: Option = None; let mode = self.mode.clone();