[PATCH] server: Fix setting context flags in get_thread_context.

Jacek Caban jacek at codeweavers.com
Mon Apr 27 11:16:01 CDT 2020


On 27.04.2020 17:38, Alexandre Julliard wrote:
> Jacek Caban <jacek at codeweavers.com> writes:
>
>> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49011
>> Signed-off-by: Jacek Caban <jacek at codeweavers.com>
>> ---
>>   dlls/kernel32/tests/thread.c | 15 +++++++++++++++
>>   server/thread.c              |  2 +-
>>   2 files changed, 16 insertions(+), 1 deletion(-)
> This fixes the server crash, but the tests are still failing here:


The attached patch should fix it. It does the right thing, but doing the 
same for setting system registers is more tricky. I had an 
implementation that tracked more closely valid registers in context 
object, which allowed moving more parts to select request. This would 
solve the problem. I ended up removing that part late in clean up 
process, because I wrongly considered that an uninteresting 
optimization. I will revisit it.


Thanks,

Jacek

-------------- next part --------------
From 5d8ac73475f25b0cc84c004ead3a87d2ed36588f Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Mon, 27 Apr 2020 18:08:59 +0200
Subject: [PATCH] server: Don't try to synchronize system registers on not
 initialized threads in get_thread_context request.
To: wine-devel <wine-devel at winehq.org>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 server/thread.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/thread.c b/server/thread.c
index 7c1c1108eb..d0dfa47712 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1840,7 +1840,7 @@ DECL_HANDLER(get_thread_context)
             if (thread->context)
             {
                 /* make sure that system regs are valid in thread context */
-                if (req->flags & system_flags & ~thread->context->regs.flags)
+                if (thread->unix_pid != -1 && (req->flags & system_flags & ~thread->context->regs.flags))
                     get_thread_context( thread, &thread->context->regs, req->flags & system_flags );
                 if (!get_error()) thread_context = (struct context *)grab_object( thread->context );
             }
-- 
2.26.1



More information about the wine-devel mailing list