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:
parent
b7f06accb0
commit
2592690540
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue