Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-11-05 20:31:36 +0300
committerCorinna Vinschen <corinna@vinschen.de>2015-11-05 20:36:51 +0300
commited3f30cf74640c4ee5a2c0f8d837eabdc51dbc76 (patch)
tree00e3ed252c39c865a5dba030429ae3c919f9599c
parentd735b30eefe2d35d0d2a2d66ac12004662fc1525 (diff)
Avoid deadlock in flock(2)
* fcntl.cc (fcntl64): Don't lock fd table when performing locking. * flock.cc (flock): Ditto. (lockf): Ditto. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/fcntl.cc6
-rw-r--r--winsup/cygwin/flock.cc6
-rw-r--r--winsup/cygwin/release/2.3.03
4 files changed, 16 insertions, 5 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index a3f7cac30..911262a89 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,11 @@
2015-11-05 Corinna Vinschen <corinna@vinschen.de>
+ * fcntl.cc (fcntl64): Don't lock fd table when performing locking.
+ * flock.cc (flock): Ditto.
+ (lockf): Ditto.
+
+2015-11-05 Corinna Vinschen <corinna@vinschen.de>
+
* sigproc.cc (pending_signals::clear): Yet another fix to fix the fix.
Actually iterate over the list of pending signals even if there's a
signal which doesn't have to be cleared. Other than that, revert loop
diff --git a/winsup/cygwin/fcntl.cc b/winsup/cygwin/fcntl.cc
index babb06424..cb97f682c 100644
--- a/winsup/cygwin/fcntl.cc
+++ b/winsup/cygwin/fcntl.cc
@@ -1,7 +1,7 @@
/* fcntl.cc: fcntl syscall
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2008, 2009,
- 2010, 2011, 2012, 2013, 2014 Red Hat, Inc.
+ 2010, 2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
This file is part of Cygwin.
@@ -32,7 +32,9 @@ fcntl64 (int fd, int cmd, ...)
{
debug_printf ("fcntl(%d, %d, ...)", fd, cmd);
- cygheap_fdget cfd (fd, true);
+
+ /* Don't lock the fd table when performing locking calls. */
+ cygheap_fdget cfd (fd, cmd < F_GETLK || cmd > F_SETLKW);
if (cfd < 0)
__leave;
diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc
index f26a76a74..0ac55485b 100644
--- a/winsup/cygwin/flock.cc
+++ b/winsup/cygwin/flock.cc
@@ -1,6 +1,6 @@
/* flock.cc. NT specific implementation of advisory file locking.
- Copyright 2003, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Red Hat, Inc.
+ Copyright 2003, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
This file is part of Cygwin.
@@ -1773,7 +1773,7 @@ flock (int fd, int operation)
__try
{
- cygheap_fdget cfd (fd, true);
+ cygheap_fdget cfd (fd);
if (cfd < 0)
__leave;
@@ -1817,7 +1817,7 @@ lockf (int filedes, int function, off_t size)
__try
{
- cygheap_fdget cfd (filedes, true);
+ cygheap_fdget cfd (filedes);
if (cfd < 0)
__leave;
diff --git a/winsup/cygwin/release/2.3.0 b/winsup/cygwin/release/2.3.0
index ceb7790ea..487ad3e4b 100644
--- a/winsup/cygwin/release/2.3.0
+++ b/winsup/cygwin/release/2.3.0
@@ -68,3 +68,6 @@ Bug Fixes
- Workaround a bug in Windows 10 NLS handling.
Addresses: https://cygwin.com/ml/cygwin/2015-10/msg00547.html
+
+- Avoid unnecessry locking and thus a potential deadlock in flock(2).
+ Addresses: https://cygwin.com/ml/cygwin/2015-11/msg00095.html