diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2004-09-17 09:10:53 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2004-09-17 09:10:53 +0000 |
commit | af444ab7bea5196f32911ae82205d613dcde0034 (patch) | |
tree | 03b76cc3986e88fbcb463e63da4811f975d003b7 | |
parent | 95a12a8594fb9c126c159c95b85abecb0bd01e0d (diff) | |
download | newlib-af444ab7bea5196f32911ae82205d613dcde0034.zip newlib-af444ab7bea5196f32911ae82205d613dcde0034.tar.gz newlib-af444ab7bea5196f32911ae82205d613dcde0034.tar.bz2 |
* syscalls.cc (unlink): Don't use "delete on close" on remote shares.
-rw-r--r-- | winsup/cygwin/ChangeLog | 4 | ||||
-rw-r--r-- | winsup/cygwin/syscalls.cc | 20 |
2 files changed, 22 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 4970631..b567cfa 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,9 @@ 2004-09-17 Corinna Vinschen <corinna@vinschen.de> + * syscalls.cc (unlink): Don't use "delete on close" on remote shares. + +2004-09-17 Corinna Vinschen <corinna@vinschen.de> + * cygwin.din (_impure_ptr): And export again. There are libs out there. 2004-09-16 Corinna Vinschen <corinna@vinschen.de> diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index ddb0da7..0aec709 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -175,8 +175,24 @@ unlink (const char *ourname) | FILE_ATTRIBUTE_SYSTEM)); } /* Attempt to use "delete on close" semantics to handle removing - a file which may be open. */ - if (wincap.has_delete_on_close ()) + a file which may be open. + + CV 2004-09-17: Not if the file is on a remote share. If two processes + have open handles on a file and one of them calls unlink, then it + happens that the file is remove from the remote share even though the + other process still has an open handle. This other process than gets + Win32 error 59, ERROR_UNEXP_NET_ERR when trying to access the file. + + For some reason, that does not happen when using DeleteFile, which + nicely succeeds but still, the file is available for the other process. + To reproduce, mount /tmp on a remote share and call + + bash -c "cat << EOF" + + Microsoft KB 837665 describes this problem as a bug in 2K3, but I have + reproduced it on shares on Samba 2.2.8, Samba 3.0.2, NT4SP6, XP64SP1 and + 2K3 and in all cases, DeleteFile works, "delete on close" does not. */ + if (!win32_name.isremote () && wincap.has_delete_on_close ()) { HANDLE h; h = CreateFile (win32_name, 0, FILE_SHARE_READ, &sec_none_nih, |