From: Rémi Bernon rbernon@codeweavers.com
This is a hack, but valgrind heuristics are having a hard time with the stack manipulation around here. This silents some annoying reports. --- dlls/ntdll/unix/signal_i386.c | 3 ++- dlls/ntdll/unix/signal_x86_64.c | 23 +++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index 9250f863145..484e9c8c72e 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -1605,10 +1605,11 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void *(--stack) = len; *(--stack) = (ULONG_PTR)args_data; *(--stack) = id; - *(--stack) = 0xdeadbabe; + *(--stack) = *(ULONG_PTR *)frame->esp;
callback_frame.frame.esp = (ULONG_PTR)stack; callback_frame.frame.eip = (ULONG_PTR)pKiUserCallbackDispatcher; + callback_frame.frame.ebp = frame->ebp; callback_frame.frame.eflags = 0x202; callback_frame.frame.syscall_flags = frame->syscall_flags; callback_frame.frame.syscall_table = frame->syscall_table; diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 98152194e5f..0b7d7bca7bc 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -64,6 +64,12 @@ #ifdef __APPLE__ # include <mach/mach.h> #endif +#ifdef HAVE_VALGRIND_VALGRIND_H +# include <valgrind/valgrind.h> +#endif +#ifdef HAVE_VALGRIND_MEMCHECK_H +# include <valgrind/memcheck.h> +#endif
#define NONAMELESSUNION #define NONAMELESSSTRUCT @@ -2404,18 +2410,31 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void { struct syscall_frame *frame = amd64_thread_data()->syscall_frame; void *args_data = (void *)((frame->rsp - len) & ~15); + ULONG_PTR *stack = args_data; + +#if defined(VALGRIND_MAKE_MEM_UNDEFINED) + VALGRIND_MAKE_MEM_UNDEFINED( (char *)stack - 0x100, (char *)frame->rsp - (char *)stack + 0x100 ); +#elif defined(VALGRIND_MAKE_WRITABLE) + VALGRIND_MAKE_WRITABLE( (char *)stack - 0x100, (char *)frame->rsp - (char *)stack + 0x100 ); +#endif
memcpy( args_data, args, len ); + *(--stack) = 0; + *(--stack) = 0; + *(--stack) = 0; + *(--stack) = 0; + *(--stack) = *(ULONG_PTR *)frame->rsp;
callback_frame.frame.rcx = id; - callback_frame.frame.rdx = (ULONG_PTR)args; + callback_frame.frame.rdx = (ULONG_PTR)args_data; callback_frame.frame.r8 = len; callback_frame.frame.cs = cs64_sel; callback_frame.frame.fs = amd64_thread_data()->fs; callback_frame.frame.gs = ds64_sel; callback_frame.frame.ss = ds64_sel; - callback_frame.frame.rsp = (ULONG_PTR)args_data - 0x28; + callback_frame.frame.rsp = (ULONG_PTR)stack; callback_frame.frame.rip = (ULONG_PTR)pKiUserCallbackDispatcher; + callback_frame.frame.rbp = frame->rbp; callback_frame.frame.eflags = 0x200; callback_frame.frame.restore_flags = CONTEXT_CONTROL | CONTEXT_INTEGER; callback_frame.frame.prev_frame = frame;