From ac5fc69b2e14dcc6d5c5380c01a9e8602bc6fa65 Mon Sep 17 00:00:00 2001 From: Praveen K Paladugu Date: Mon, 24 Nov 2025 15:03:09 -0600 Subject: [PATCH] vmm: Fix fd leak in socket connection handling Previously, `into_raw_fd()` transferred fd ownership to epoll while keeping separate clones in `reader` and `writer`, causing leaks when the stream was closed. Now, `reader` owns the fd and epoll borrows it. When the FD is closed in the kernel, reader will be reset to None. Signed-off-by: Praveen K Paladugu --- vmm/src/serial_manager.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/vmm/src/serial_manager.rs b/vmm/src/serial_manager.rs index efb8d67e8..4c886c73e 100644 --- a/vmm/src/serial_manager.rs +++ b/vmm/src/serial_manager.rs @@ -6,7 +6,7 @@ use std::fs::File; use std::io::Read; use std::net::Shutdown; -use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; +use std::os::unix::io::{AsRawFd, FromRawFd}; use std::os::unix::net::UnixStream; use std::panic::AssertUnwindSafe; use std::path::PathBuf; @@ -329,20 +329,19 @@ impl SerialManager { listener.accept().map_err(Error::AcceptConnection)?; let writer = unix_stream.try_clone().map_err(Error::CloneUnixStream)?; - reader = Some( - unix_stream.try_clone().map_err(Error::CloneUnixStream)?, - ); epoll::ctl( epoll_fd, epoll::ControlOptions::EPOLL_CTL_ADD, - unix_stream.into_raw_fd(), + unix_stream.as_raw_fd(), epoll::Event::new( epoll::Events::EPOLLIN, EpollDispatch::File as u64, ), ) .map_err(Error::Epoll)?; + + reader = Some(unix_stream); serial.lock().unwrap().set_out(Some(Box::new(writer))); } EpollDispatch::File => {