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>
This commit is contained in:
Corinna Vinschen 2015-11-05 18:31:36 +01:00
parent eeef727026
commit 41299df081
4 changed files with 16 additions and 5 deletions

View File

@ -1,3 +1,9 @@
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> 2015-11-05 Corinna Vinschen <corinna@vinschen.de>
* sigproc.cc (pending_signals::clear): Yet another fix to fix the fix. * sigproc.cc (pending_signals::clear): Yet another fix to fix the fix.

View File

@ -1,7 +1,7 @@
/* fcntl.cc: fcntl syscall /* fcntl.cc: fcntl syscall
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2008, 2009, 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. This file is part of Cygwin.
@ -32,7 +32,9 @@ fcntl64 (int fd, int cmd, ...)
{ {
debug_printf ("fcntl(%d, %d, ...)", fd, 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) if (cfd < 0)
__leave; __leave;

View File

@ -1,6 +1,6 @@
/* flock.cc. NT specific implementation of advisory file locking. /* 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. This file is part of Cygwin.
@ -1773,7 +1773,7 @@ flock (int fd, int operation)
__try __try
{ {
cygheap_fdget cfd (fd, true); cygheap_fdget cfd (fd);
if (cfd < 0) if (cfd < 0)
__leave; __leave;
@ -1817,7 +1817,7 @@ lockf (int filedes, int function, off_t size)
__try __try
{ {
cygheap_fdget cfd (filedes, true); cygheap_fdget cfd (filedes);
if (cfd < 0) if (cfd < 0)
__leave; __leave;

View File

@ -65,3 +65,6 @@ Bug Fixes
- Workaround a bug in Windows 10 NLS handling. - Workaround a bug in Windows 10 NLS handling.
Addresses: https://cygwin.com/ml/cygwin/2015-10/msg00547.html 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