diff options
author | David Stevens <stevensd@chromium.org> | 2019-10-09 18:41:44 +0900 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-24 02:19:10 +0000 |
commit | f60d367467496c38a4a599e467d717d16358dab1 (patch) | |
tree | f050a9d20ed3adb23d426eb628bdbea9d352f5a9 | |
parent | 7154c0f1e312f6b70e55eef8d7ecdcc47600ac36 (diff) | |
download | crosvm-f60d367467496c38a4a599e467d717d16358dab1.tar crosvm-f60d367467496c38a4a599e467d717d16358dab1.tar.gz crosvm-f60d367467496c38a4a599e467d717d16358dab1.tar.bz2 crosvm-f60d367467496c38a4a599e467d717d16358dab1.tar.lz crosvm-f60d367467496c38a4a599e467d717d16358dab1.tar.xz crosvm-f60d367467496c38a4a599e467d717d16358dab1.tar.zst crosvm-f60d367467496c38a4a599e467d717d16358dab1.zip |
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 <zachr@chromium.org> Tested-by: David Stevens <stevensd@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: David Stevens <stevensd@chromium.org>
-rw-r--r-- | gpu_renderer/src/lib.rs | 9 |
1 files changed, 9 insertions, 0 deletions
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); } |