Alexandre Julliard : kernel32: Call build_argv in the parent process so that it can use the Win32 heap.
Alexandre Julliard
julliard at winehq.org
Fri Oct 31 09:24:16 CDT 2008
Module: wine
Branch: master
Commit: da03d9355da4776a0eaf2da990b025f27ebbadad
URL: http://source.winehq.org/git/wine.git/?a=commit;h=da03d9355da4776a0eaf2da990b025f27ebbadad
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Oct 31 14:02:04 2008 +0100
kernel32: Call build_argv in the parent process so that it can use the Win32 heap.
---
dlls/kernel32/process.c | 22 ++++++++++++++++------
1 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index c8aba47..4524e65 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -1074,7 +1074,7 @@ static char **build_argv( const WCHAR *cmdlineW, int reserved )
int in_quotes,bcount,len;
len = WideCharToMultiByte( CP_UNIXCP, 0, cmdlineW, -1, NULL, 0, NULL, NULL );
- if (!(cmdline = malloc(len))) return NULL;
+ if (!(cmdline = HeapAlloc( GetProcessHeap(), 0, len ))) return NULL;
WideCharToMultiByte( CP_UNIXCP, 0, cmdlineW, -1, cmdline, len, NULL, NULL );
argc=reserved+1;
@@ -1106,11 +1106,14 @@ static char **build_argv( const WCHAR *cmdlineW, int reserved )
}
s++;
}
- argv=malloc(argc*sizeof(*argv));
- if (!argv)
+ if (!(argv = HeapAlloc( GetProcessHeap(), 0, argc*sizeof(*argv) + len )))
+ {
+ HeapFree( GetProcessHeap(), 0, cmdline );
return NULL;
+ }
- arg=d=s=cmdline;
+ arg = d = s = (char *)(argv + argc);
+ memcpy( d, cmdline, len );
bcount=0;
in_quotes=0;
argc=reserved;
@@ -1162,6 +1165,7 @@ static char **build_argv( const WCHAR *cmdlineW, int reserved )
}
argv[argc]=NULL;
+ HeapFree( GetProcessHeap(), 0, cmdline );
return argv;
}
@@ -1235,6 +1239,7 @@ static int fork_and_exec( const char *filename, const WCHAR *cmdline, const WCHA
{
int fd[2], stdin_fd = -1, stdout_fd = -1;
int pid, err;
+ char **argv;
if (!env) env = GetEnvironmentStringsW();
@@ -1266,10 +1271,12 @@ static int fork_and_exec( const char *filename, const WCHAR *cmdline, const WCHA
wine_server_handle_to_fd( hstdout, FILE_WRITE_DATA, &stdout_fd, NULL );
}
+ argv = build_argv( cmdline, 0 );
+
if (!(pid = fork())) /* child */
{
- char **argv = build_argv( cmdline, 0 );
char **envp = build_envp( env );
+
close( fd[0] );
if (flags & (CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE | DETACHED_PROCESS))
@@ -1314,6 +1321,7 @@ static int fork_and_exec( const char *filename, const WCHAR *cmdline, const WCHA
write( fd[1], &err, sizeof(err) );
_exit(1);
}
+ HeapFree( GetProcessHeap(), 0, argv );
if (stdin_fd != -1) close( stdin_fd );
if (stdout_fd != -1) close( stdout_fd );
close( fd[1] );
@@ -1426,6 +1434,7 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW
HANDLE process_info, hstdin, hstdout;
WCHAR *env_end;
char *winedebug = NULL;
+ char **argv;
RTL_USER_PROCESS_PARAMETERS *params;
int socketfd[2], stdin_fd = -1, stdout_fd = -1;
pid_t pid;
@@ -1524,11 +1533,11 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW
if (hstdout) wine_server_handle_to_fd( hstdout, FILE_WRITE_DATA, &stdout_fd, NULL );
/* create the child process */
+ argv = build_argv( cmd_line, 1 );
if (exec_only || !(pid = fork())) /* child */
{
char preloader_reserve[64], socket_env[64];
- char **argv = build_argv( cmd_line, 1 );
if (flags & (CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE | DETACHED_PROCESS))
{
@@ -1577,6 +1586,7 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW
if (stdin_fd != -1) close( stdin_fd );
if (stdout_fd != -1) close( stdout_fd );
close( socketfd[0] );
+ HeapFree( GetProcessHeap(), 0, argv );
HeapFree( GetProcessHeap(), 0, winedebug );
if (pid == -1)
{
More information about the wine-cvs
mailing list