Module: wine Branch: master Commit: 3d3c92782a3ef14ba62d751ba1e321bba19a891a URL: http://source.winehq.org/git/wine.git/?a=commit;h=3d3c92782a3ef14ba62d751ba1...
Author: Sebastian Lackner sebastian@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; }