summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Stevens <stevensd@chromium.org>2019-10-09 18:41:44 +0900
committerCommit Bot <commit-bot@chromium.org>2019-10-24 02:19:10 +0000
commitf60d367467496c38a4a599e467d717d16358dab1 (patch)
treef050a9d20ed3adb23d426eb628bdbea9d352f5a9
parent7154c0f1e312f6b70e55eef8d7ecdcc47600ac36 (diff)
downloadcrosvm-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.rs9
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);
         }