[Bug 52892] New: The 64-bit ntdll:thread fails on w7pro64 and w864

WineHQ Bugzilla wine-bugs at winehq.org
Tue Apr 26 05:42:03 CDT 2022


https://bugs.winehq.org/show_bug.cgi?id=52892

            Bug ID: 52892
           Summary: The 64-bit ntdll:thread fails on w7pro64 and w864
           Product: Wine
           Version: unspecified
          Hardware: x86-64
                OS: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: ntdll
          Assignee: wine-bugs at winehq.org
          Reporter: fgouget at codeweavers.com

The 64-bit ntdll:thread fails on w7pro64 and w864:

thread.c:153: Test failed: Multiple threads have TEB 000007FFFFFDC000.

https://test.winehq.org/data/patterns.html#ntdll:thread


The failure is hard to reproduce but the test was introduced by this commit:

commit 6d4ec1255acceec7152ed98764ee29991ac04f10
Author:     Brendan Shanks <bshanks at codeweavers.com>
AuthorDate: Mon Apr 18 11:25:10 2022 -0700
Commit:     Alexandre Julliard <julliard at winehq.org>
CommitDate: Mon Apr 18 21:48:15 2022 +0200

    ntdll/tests: Test that threads have unique TEBs.

    Signed-off-by: Brendan Shanks <bshanks at codeweavers.com>
    Signed-off-by: Alexandre Julliard <julliard at winehq.org>


Specifically the issue is with the line below:

+    ok( teb1 != teb2, "Multiple threads have TEB %p.\n", teb1 );


I think the issue is that there is no guarantee that the two test threads are
running at the same time. I suspect that sometimes what happens is this [1]:


* status = pNtCreateThreadEx( &threads[0], ... &teb1, ... );
  A new TEB is allocated, the first thread starts, sets teb1 and terminates at
which time its TEB is freed.

* status = pNtCreateThreadEx( &threads[1], ... &teb2, ... );
  A new TEB is allocated, hey there's a fresh TEB that has just bee freed! [2].
The second thread starts and sets teb2.

* WaitForMultipleObjects( 2, threads, TRUE, INFINITE );
  Wait for both threads.

* ok( teb1 != teb2, "Multiple threads have TEB %p.\n", teb1 );
  Hey, both threads used the same TEB!
  But did they do so at the same time?

One hacky fix would be to at a small sleep in the test threads but that's
introducing race conditions. A better fix would be for the main thread to tell
the test threads when they can exit through some synchronization object.


[1] This may be tied to how the scheduler behaves which may limit the issue to
specific Windows versions.
[2] And that's probably tied to how the memory allocator behaves: more memory
locality or less chance of overwriting (incorrectly) still in use memory. Again
this could limit the issue to some Windows versions.

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list