Resetting their length to make sure we pass alignment checks both for their current values and for the new values we'll write.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46472 Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- server/ptrace.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/server/ptrace.c b/server/ptrace.c index bcd0fe48f16..b9dd9e9539a 100644 --- a/server/ptrace.c +++ b/server/ptrace.c @@ -633,8 +633,7 @@ void set_thread_context( struct thread *thread, const context_t *context, unsign switch (context->machine) { case IMAGE_FILE_MACHINE_I386: - /* Linux 2.6.33+ does DR0-DR3 alignment validation, so it has to know LEN bits first */ - if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->debug.i386_regs.dr7 & 0xffff0000 ) == -1) goto error; + if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), 0 ) == -1) goto error; if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(0), context->debug.i386_regs.dr0 ) == -1) goto error; if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(1), context->debug.i386_regs.dr1 ) == -1) goto error; if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(2), context->debug.i386_regs.dr2 ) == -1) goto error; @@ -646,7 +645,7 @@ void set_thread_context( struct thread *thread, const context_t *context, unsign thread->system_regs |= SERVER_CTX_DEBUG_REGISTERS; break; case IMAGE_FILE_MACHINE_AMD64: - if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->debug.x86_64_regs.dr7 & 0xffff0000 ) == -1) goto error; + if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), 0 ) == -1) goto error; if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(0), context->debug.x86_64_regs.dr0 ) == -1) goto error; if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(1), context->debug.x86_64_regs.dr1 ) == -1) goto error; if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(2), context->debug.x86_64_regs.dr2 ) == -1) goto error;
It is needed for Linux Kernel version 4.18, and has been fixed in 4.19.
Also see https://bugzilla.kernel.org/show_bug.cgi?id=200965 for a more detailed description of the regression and the fix.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46472 Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- server/ptrace.c | 3 --- 1 file changed, 3 deletions(-)
diff --git a/server/ptrace.c b/server/ptrace.c index b9dd9e9539a..1875e1dfd56 100644 --- a/server/ptrace.c +++ b/server/ptrace.c @@ -627,9 +627,6 @@ void set_thread_context( struct thread *thread, const context_t *context, unsign
if (!suspend_for_ptrace( thread )) return;
- /* force all breakpoint lengths to 1, workaround for kernel bug 200965 */ - ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), 0x11110055 ); - switch (context->machine) { case IMAGE_FILE_MACHINE_I386: