Commit 25926905 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

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: 's avatarZebediah Figura <z.figura12@gmail.com> Signed-off-by: 's avatarHans Leidekker <hans@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent b7f06acc
......@@ -28,6 +28,7 @@
#include <stdio.h>
#include "wine/debug.h"
#include "wine/heap.h"
#include "wine/unicode.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)
{
GUID *guid = arg;
return __wine_msi_call_dll_function(guid);
GUID guid = *(GUID *)arg;
heap_free(arg);
return __wine_msi_call_dll_function(&guid);
}
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};
DWORD client_pid = atoiW(arg);
GUID guid, *thread_guid;
DWORD64 thread64;
WCHAR buffer[24];
HANDLE thread;
HANDLE pipe;
DWORD size;
GUID guid;
TRACE("%s\n", debugstr_w(arg));
......@@ -443,7 +445,9 @@ static int custom_action_server(const WCHAR *arg)
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
* to run a nested action and can't block during this one */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment