This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH] Cygwin: timerfd: avoid a deadlock
- From: Ken Brown <kbrown at cornell dot edu>
- To: "cygwin-patches at cygwin dot com" <cygwin-patches at cygwin dot com>
- Date: Mon, 24 Jun 2019 20:19:21 +0000
- Subject: [PATCH] Cygwin: timerfd: avoid a deadlock
If a timer expires while the timerfd thread is in its inner loop,
check for the thread cancellation event before trying to enter
a_critical_section. It's possible that timerfd_tracker::dtor has
entered its critical section and is trying to cancel the thread. See
http://www.cygwin.org/ml/cygwin/2019-06/msg00096.html.
---
winsup/cygwin/timerfd.cc | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/winsup/cygwin/timerfd.cc b/winsup/cygwin/timerfd.cc
index 8e4c94e66..e8261ef2e 100644
--- a/winsup/cygwin/timerfd.cc
+++ b/winsup/cygwin/timerfd.cc
@@ -137,6 +137,11 @@ timerfd_tracker::thread_func ()
continue;
}
+ /* Avoid a deadlock if dtor has just entered its critical
+ section and is trying to cancel the thread. */
+ if (IsEventSignalled (cancel_evt))
+ goto canceled;
+
if (!enter_critical_section ())
continue;
/* Make sure we haven't been abandoned and/or disarmed
--
2.21.0