msiexec: Don't keep the custom action GUID in the main thread's stack.

Since it could potentially change on us during an asynchronous custom action.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2018-08-16 10:34:40 -05:00 committed by Alexandre Julliard
parent b7f06accb0
commit 2592690540
1 changed files with 8 additions and 4 deletions

View File

@ -28,6 +28,7 @@
#include <stdio.h> #include <stdio.h>
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/heap.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "initguid.h" #include "initguid.h"
@ -400,20 +401,21 @@ extern UINT CDECL __wine_msi_call_dll_function(GUID *guid);
static DWORD CALLBACK custom_action_thread(void *arg) static DWORD CALLBACK custom_action_thread(void *arg)
{ {
GUID *guid = arg; GUID guid = *(GUID *)arg;
return __wine_msi_call_dll_function(guid); heap_free(arg);
return __wine_msi_call_dll_function(&guid);
} }
static int custom_action_server(const WCHAR *arg) static int custom_action_server(const WCHAR *arg)
{ {
static const WCHAR pipe_name[] = {'\\','\\','.','\\','p','i','p','e','\\','m','s','i','c','a','_','%','x','_','%','d',0}; static const WCHAR pipe_name[] = {'\\','\\','.','\\','p','i','p','e','\\','m','s','i','c','a','_','%','x','_','%','d',0};
DWORD client_pid = atoiW(arg); DWORD client_pid = atoiW(arg);
GUID guid, *thread_guid;
DWORD64 thread64; DWORD64 thread64;
WCHAR buffer[24]; WCHAR buffer[24];
HANDLE thread; HANDLE thread;
HANDLE pipe; HANDLE pipe;
DWORD size; DWORD size;
GUID guid;
TRACE("%s\n", debugstr_w(arg)); TRACE("%s\n", debugstr_w(arg));
@ -443,7 +445,9 @@ static int custom_action_server(const WCHAR *arg)
return 0; return 0;
} }
thread = CreateThread(NULL, 0, custom_action_thread, &guid, 0, NULL); thread_guid = heap_alloc(sizeof(GUID));
memcpy(thread_guid, &guid, sizeof(GUID));
thread = CreateThread(NULL, 0, custom_action_thread, thread_guid, 0, NULL);
/* give the thread handle to the client to wait on, since we might have /* give the thread handle to the client to wait on, since we might have
* to run a nested action and can't block during this one */ * to run a nested action and can't block during this one */