diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2019-03-08 14:51:10 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2019-03-08 14:57:42 +0300 |
commit | 4ec5ffc198fcdcbea2dbca81a337900ac33b1fa7 (patch) | |
tree | 97d0ec123459c8c84dc480520bcbd0cc5a25b0b2 | |
parent | 094a2a17ad1cd65909fa2eee648d049d8d69fc45 (diff) |
Cygwin: posix timers: fix a deadlockcygwin-3_0_3-release
Canceling the timer thread runs under lock. The thread uses the same
lock to guard its timer_tracker struct access. If the timing is bad,
timer_settime or timer_delete grab the lock at the same time, the timer
expires. In the end, cancel waits for the thread sync while the thread
waits for ther lock to be released.
Fix this by not waiting for the thread sync under lock.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/posix_timer.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/release/3.0.3 | 3 |
2 files changed, 5 insertions, 0 deletions
diff --git a/winsup/cygwin/posix_timer.cc b/winsup/cygwin/posix_timer.cc index a140b00e9..c0d548fe9 100644 --- a/winsup/cygwin/posix_timer.cc +++ b/winsup/cygwin/posix_timer.cc @@ -31,7 +31,9 @@ timer_tracker::cancel () SetEvent (cancel_evt); if (sync_thr) { + ReleaseSRWLockExclusive (&srwlock); res = WaitForSingleObject (sync_thr, INFINITE); + AcquireSRWLockExclusive (&srwlock); if (res != WAIT_OBJECT_0) debug_printf ("WFSO returned unexpected value %u, %E", res); } diff --git a/winsup/cygwin/release/3.0.3 b/winsup/cygwin/release/3.0.3 index 66ae63943..b8c89cbe9 100644 --- a/winsup/cygwin/release/3.0.3 +++ b/winsup/cygwin/release/3.0.3 @@ -11,3 +11,6 @@ Bug Fixes - Fix a resource leak in posix timers. Addresses: https://cygwin.com/ml/cygwin/2019-03/msg00120.html + +- Fix a deadlock in posix timers + Addresses: https://cygwin.com/ml/cygwin/2019-03/msg00158.html |