Sebastian Lackner : server: Fix several fd leaks on error in new_process wineserver call.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 20 09:54:15 CST 2014


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

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Thu Nov 20 04:12:48 2014 +0100

server: Fix several fd leaks on error in new_process wineserver call.

---

 server/process.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/server/process.c b/server/process.c
index 7b9a3b2..4a356b9 100644
--- a/server/process.c
+++ b/server/process.c
@@ -911,14 +911,21 @@ DECL_HANDLER(new_process)
     }
 
     /* build the startup info for a new process */
-    if (!(info = alloc_object( &startup_info_ops ))) return;
+    if (!(info = alloc_object( &startup_info_ops )))
+    {
+        close( socket_fd );
+        return;
+    }
     info->exe_file = NULL;
     info->process  = NULL;
     info->data     = NULL;
 
     if (req->exe_file &&
         !(info->exe_file = get_file_obj( current->process, req->exe_file, FILE_READ_DATA )))
+    {
+        close( socket_fd );
         goto done;
+    }
 
     info->data_size = get_req_data_size();
     info->info_size = min( req->info_size, info->data_size );
@@ -929,7 +936,11 @@ DECL_HANDLER(new_process)
         data_size_t env_size = info->data_size - info->info_size;
         data_size_t info_size = min( req->info_size, FIELD_OFFSET( startup_info_t, curdir_len ));
 
-        if (!(info->data = mem_alloc( sizeof(*info->data) + env_size ))) goto done;
+        if (!(info->data = mem_alloc( sizeof(*info->data) + env_size )))
+        {
+            close( socket_fd );
+            goto done;
+        }
         memcpy( info->data, get_req_data(), info_size );
         memset( (char *)info->data + info_size, 0, sizeof(*info->data) - info_size );
         memcpy( info->data + 1, (const char *)get_req_data() + req->info_size, env_size );
@@ -940,7 +951,11 @@ DECL_HANDLER(new_process)
     {
         data_size_t pos = sizeof(*info->data);
 
-        if (!(info->data = memdup( get_req_data(), info->data_size ))) goto done;
+        if (!(info->data = memdup( get_req_data(), info->data_size )))
+        {
+            close( socket_fd );
+            goto done;
+        }
 #define FIXUP_LEN(len) do { (len) = min( (len), info->info_size - pos ); pos += (len); } while(0)
         FIXUP_LEN( info->data->curdir_len );
         FIXUP_LEN( info->data->dllpath_len );




More information about the wine-cvs mailing list