Sebastian Lackner : server: Avoid leaking file descriptor on error in create_file_for_fd.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Nov 18 10:25:18 CST 2014


Module: wine
Branch: master
Commit: 3d3c92782a3ef14ba62d751ba1e321bba19a891a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3d3c92782a3ef14ba62d751ba1e321bba19a891a

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Mon Nov 17 19:19:08 2014 +0100

server: Avoid leaking file descriptor on error in create_file_for_fd.

---

 server/file.c | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/server/file.c b/server/file.c
index cceb8ad..abda2c3 100644
--- a/server/file.c
+++ b/server/file.c
@@ -120,21 +120,25 @@ struct file *create_file_for_fd( int fd, unsigned int access, unsigned int shari
     if (fstat( fd, &st ) == -1)
     {
         file_set_error();
+        close( fd );
         return NULL;
     }
 
-    if ((file = alloc_object( &file_ops )))
+    if (!(file = alloc_object( &file_ops )))
     {
-        file->mode = st.st_mode;
-        file->access = default_fd_map_access( &file->obj, access );
-        if (!(file->fd = create_anonymous_fd( &file_fd_ops, fd, &file->obj,
-                                              FILE_SYNCHRONOUS_IO_NONALERT )))
-        {
-            release_object( file );
-            return NULL;
-        }
-        allow_fd_caching( file->fd );
+        close( fd );
+        return NULL;
+    }
+
+    file->mode = st.st_mode;
+    file->access = default_fd_map_access( &file->obj, access );
+    if (!(file->fd = create_anonymous_fd( &file_fd_ops, fd, &file->obj,
+                                          FILE_SYNCHRONOUS_IO_NONALERT )))
+    {
+        release_object( file );
+        return NULL;
     }
+    allow_fd_caching( file->fd );
     return file;
 }
 




More information about the wine-cvs mailing list