diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2015-11-05 20:31:36 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-11-05 20:36:51 +0300 |
commit | ed3f30cf74640c4ee5a2c0f8d837eabdc51dbc76 (patch) | |
tree | 00e3ed252c39c865a5dba030429ae3c919f9599c | |
parent | d735b30eefe2d35d0d2a2d66ac12004662fc1525 (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/ChangeLog | 6 | ||||
-rw-r--r-- | winsup/cygwin/fcntl.cc | 6 | ||||
-rw-r--r-- | winsup/cygwin/flock.cc | 6 | ||||
-rw-r--r-- | winsup/cygwin/release/2.3.0 | 3 |
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 |