flock still buggy

Eric Blake ebb9@byu.net
Wed Jul 22 16:39:00 GMT 2009


Corinna Vinschen <corinna-cygwin <at> cygwin.com> writes:

> > $ ./foo 4& sleep 2; ./foo 0
> > 
> > Oops - process 14060 got the lock before 12692 and 21704 exited.
> 
> This looks different with my patch:
> 

Yep, so far, it looks like your patch follows the semantics I expect for every 
one of my tests (the lock remains until explicitly unlocked, or until all 
handles are closed, whether by explicit close, process exit, or close-on-
exec).  And the original autoconf question which raised this issue in the first 
place now passes.

I'm not sure whether there are lurking bugs in fcntl/lockf locking, but I think 
we've finally nailed the last of the flock bugs.

> > Oops - process 26264 successfully unlocked fd, even though it was marked 
close-
> > on-exec by 10932 before the fork.
> 
> Well, sure, it has been marked close-on-exec, but this doesn't mean
> the descriptor is invalid after the fork.  AFAICS it's perfectly
> valid for the forked child 26264 to unlock the BSD lock.  What am
> I missing?

Nothing.  I guess I wasn't thinking straight on this case - a fork is not the 
same as exec, and I validated that even without your patch, flock(LOCK_UN) 
fails on closed fd, and close-on-exec does close the fd when I actually get to 
the exec.

By the way, your posted patch missed out on fhandler.cc; I assume this is what 
you meant:

diff --git i/winsup/cygwin/fhandler.cc w/winsup/cygwin/fhandler.cc
index ffbd02f..ade2c6e 100644
--- i/winsup/cygwin/fhandler.cc
+++ w/winsup/cygwin/fhandler.cc
@@ -1,7 +1,7 @@
 /* fhandler.cc.  See console.cc for fhandler_console functions.

    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-   2005, 2006, 2007, 2008 Red Hat, Inc.
+   2005, 2006, 2007, 2008, 2009 Red Hat, Inc.

 This file is part of Cygwin.

@@ -1034,7 +1034,7 @@ fhandler_base::close ()
   /* Delete all POSIX locks on the file.  Delete all flock locks on the
      file if this is the last reference to this file. */
   if (unique_id)
-    del_my_locks (false);
+    del_my_locks (after_close);
   if (nohandle () || CloseHandle (get_handle ()))
     res = 0;
   else
@@ -1359,7 +1359,7 @@ fhandler_base::fixup_after_fork (HANDLE parent)
     setup_overlapped ();
   /* POSIX locks are not inherited across fork. */
   if (unique_id)
-    del_my_locks (true);
+    del_my_locks (after_fork);
 }

 void
@@ -1369,7 +1369,7 @@ fhandler_base::fixup_after_exec ()
   if (get_overlapped ())
     setup_overlapped ();
   if (unique_id && close_on_exec ())
-    del_my_locks (false);
+    del_my_locks (after_exec);
 }

 bool


-- 
Eric Blake





--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list