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 | 2 +- dlls/ntdll/unix/signal_x86_64.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index caa635881bb..09c61025db9 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -1669,7 +1669,7 @@ 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;
return call_user_mode_callback( pKiUserCallbackDispatcher, stack, ret_ptr, ret_len, NtCurrentTeb() ); } diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 39373b5f3dc..079b5549443 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 @@ -1716,12 +1722,18 @@ NTSTATUS WINAPI KeUserModeCallback( ULONG id, const void *args, ULONG len, void if ((char *)ntdll_get_thread_data()->kernel_stack + min_kernel_stack > (char *)&frame) return STATUS_STACK_OVERFLOW;
+#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) = len; *(--stack) = (ULONG_PTR)args_data; *(--stack) = id; - *(--stack) = 0xdeadbabe; + *(--stack) = *(ULONG_PTR *)frame->rsp;
return call_user_mode_callback( pKiUserCallbackDispatcher, stack, ret_ptr, ret_len, NtCurrentTeb() ); }