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