Added patch to fix race-condition when threads are killed during shutdown.

This commit is contained in:
Sebastian Lackner 2015-02-25 23:07:29 +01:00
parent 11fe964c46
commit 8f64b37ee2
6 changed files with 79 additions and 1 deletions

View File

@ -38,6 +38,11 @@ Wine. All those differences are also documented on the
Included bug fixes and improvements
===================================
**Bugfixes and features included in the next upcoming release [1]:**
* Fix race-condition when threads are killed during shutdown
**Bugs fixed in Wine Staging 1.7.37 [182]:**
* Add Dynamic DST exceptions for Israel Standard Time ([Wine Bug #36374](https://bugs.winehq.org/show_bug.cgi?id=36374))

1
debian/changelog vendored
View File

@ -5,6 +5,7 @@ wine-staging (1.7.38) UNRELEASED; urgency=low
* Added patch to skip Wine specific __wine_check_for_events calls in ReactOS (by Amine Khaldi, wine-patched/pull/4).
* Added patch to declare pDirectInputCreateEx in a MSVC compatible way (by Amine Khaldi, wine-patched/pull/5).
* Added patch to complete and properly pack DNS_HEADER structure (by Amine Khaldi, wine-patched/pull/6).
* Added patch to fix race-condition when threads are killed during shutdown.
* Removed patch to properly call DriverUnload when unloading device drivers (accepted upstream).
* Removed patch to allow Accept-Encoding for HTTP/1.0 in wininet (accepted upstream).
* Removed patch to declare pDirectInputCreateEx in a MSVC compatible way (accepted upstream).

View File

@ -0,0 +1,55 @@
From f7a85ba8219c46b226376aed23f2d81bfff902dc Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Wed, 25 Feb 2015 22:45:42 +0100
Subject: ntdll: Fix race-condition when threads are killed during shutdown.
When exit_thread is executed, nb_threads is decremented before the thread is
fully shutdown. When another thread runs ExitProcess() this will cause a SIGQUIT
signal to all threads, effectively decrementing nb_threads twice. The process
will terminate with a wrong exitcode then because the refcount reaches zero too
early.
Currently Wine has no locking protection of LdrShutdownProcess(), so it can
only be executed safely when all other threads have terminated before. Most
likely there are more Wine bugs in this area, but the attached patch should
fix the most critical one (messed up refcounting of threads) for now.
---
dlls/ntdll/thread.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 3696c8e..74e64c9 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -370,6 +370,7 @@ void terminate_thread( int status )
void exit_thread( int status )
{
static void *prev_teb;
+ sigset_t sigset;
TEB *teb;
if (status) /* send the exit code to the server (0 is already the default) */
@@ -383,7 +384,7 @@ void exit_thread( int status )
SERVER_END_REQ;
}
- if (interlocked_xchg_add( &nb_threads, -1 ) <= 1)
+ if (interlocked_xchg_add( &nb_threads, 0 ) <= 1)
{
LdrShutdownProcess();
exit( status );
@@ -405,6 +406,11 @@ void exit_thread( int status )
}
}
+ sigemptyset( &sigset );
+ sigaddset( &sigset, SIGQUIT );
+ pthread_sigmask( SIG_BLOCK, &sigset, NULL );
+ if (interlocked_xchg_add( &nb_threads, -1 ) <= 1) _exit( status );
+
close( ntdll_get_thread_data()->wait_fd[0] );
close( ntdll_get_thread_data()->wait_fd[1] );
close( ntdll_get_thread_data()->reply_fd );
--
2.3.0

View File

@ -0,0 +1 @@
Fixes: Fix race-condition when threads are killed during shutdown

View File

@ -133,6 +133,7 @@ patch_enable_all ()
enable_ntdll_RtlIpv4StringToAddressExA="$1"
enable_ntdll_RtlUnwindEx="$1"
enable_ntdll_ThreadTime="$1"
enable_ntdll_Threading="$1"
enable_ntdll_User_Shared_Data="$1"
enable_ntdll_Vista_Threadpool="$1"
enable_ntdll_WRITECOPY="$1"
@ -430,6 +431,9 @@ patch_enable ()
ntdll-ThreadTime)
enable_ntdll_ThreadTime="$2"
;;
ntdll-Threading)
enable_ntdll_Threading="$2"
;;
ntdll-User_Shared_Data)
enable_ntdll_User_Shared_Data="$2"
;;
@ -2743,6 +2747,18 @@ if test "$enable_ntdll_ThreadTime" -eq 1; then
) >> "$patchlist"
fi
# Patchset ntdll-Threading
# |
# | Modified files:
# | * dlls/ntdll/thread.c
# |
if test "$enable_ntdll_Threading" -eq 1; then
patch_apply ntdll-Threading/0001-ntdll-Fix-race-condition-when-threads-are-killed-dur.patch
(
echo '+ { "Sebastian Lackner", "ntdll: Fix race-condition when threads are killed during shutdown.", 1 },';
) >> "$patchlist"
fi
# Patchset ntdll-User_Shared_Data
# |
# | Modified files:

View File

@ -473,7 +473,7 @@ diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c
--- a/dlls/d3d8/tests/visual.c
+++ b/dlls/d3d8/tests/visual.c
@@ -5034,7 +5034,11 @@
@@ -5033,7 +5033,11 @@
fill_surface(surface_managed, 0x0000ff00, D3DLOCK_NO_DIRTY_UPDATE);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);