From f60d367467496c38a4a599e467d717d16358dab1 Mon Sep 17 00:00:00 2001 From: David Stevens Date: Wed, 9 Oct 2019 18:41:44 +0900 Subject: gpu_renderer: fix fd leak on export failure BUG=None TEST=arcvm boots Change-Id: Id5d3bb422fcaa4906d1a6dfca2f98269d1bafc2c Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1847537 Reviewed-by: Zach Reizner Tested-by: David Stevens Tested-by: kokoro Commit-Queue: David Stevens --- gpu_renderer/src/lib.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gpu_renderer/src/lib.rs b/gpu_renderer/src/lib.rs index f04ee66..be8c17a 100644 --- a/gpu_renderer/src/lib.rs +++ b/gpu_renderer/src/lib.rs @@ -19,6 +19,8 @@ use std::rc::Rc; use std::result; use std::sync::atomic::{AtomicBool, Ordering}; +use libc::close; + use data_model::{VolatileMemory, VolatileSlice}; use sys_util::{GuestAddress, GuestMemory}; @@ -564,6 +566,13 @@ impl Resource { pub fn export(&self) -> Result<(Query, File)> { let query = self.export_query(true)?; if query.out_num_fds != 1 || query.out_fds[0] < 0 { + for fd in &query.out_fds { + if *fd >= 0 { + // Safe because the FD was just returned by a successful virglrenderer + // call so it must be valid and owned by us. + unsafe { close(*fd) }; + } + } return Err(Error::ExportedResourceDmabuf); } -- cgit 1.4.1