diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2008-02-20 14:42:29 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2008-02-20 14:42:29 +0000 |
commit | 44464b015610d5da982bc58e5ccc4cfda38a9274 (patch) | |
tree | c58647dc04b30aee5d388b4fbb5ee9f88e75679f | |
parent | 6532abb624384b9c0429928e5a9f88a8d77009cf (diff) | |
download | newlib-44464b015610d5da982bc58e5ccc4cfda38a9274.zip newlib-44464b015610d5da982bc58e5ccc4cfda38a9274.tar.gz newlib-44464b015610d5da982bc58e5ccc4cfda38a9274.tar.bz2 |
* path.cc (cwdstuff::set): Revert error handling change in case
DuplicateHandle fails, because it breaks Vista/Longhorn workaround.
-rw-r--r-- | winsup/cygwin/ChangeLog | 5 | ||||
-rw-r--r-- | winsup/cygwin/path.cc | 22 |
2 files changed, 14 insertions, 13 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c310ebb..3cb2cfd 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2008-02-20 Corinna Vinschen <corinna@vinschen.de> + + * path.cc (cwdstuff::set): Revert error handling change in case + DuplicateHandle fails, because it breaks Vista/Longhorn workaround. + 2008-02-19 Christopher Faylor <me+cygwin@cgf.cx> * sigproc.cc (sig_send): Use sigmask of target thread if it is diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index b57a2ce..3929360 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -4429,7 +4429,7 @@ cwdstuff::set (PUNICODE_STRING nat_cwd, const char *posix_cwd, bool doit) - Unlinking a cwd fails because SetCurrentDirectory seems to open directories so that deleting the directory is disallowed. The below code opens with *all* sharing flags set. */ - HANDLE h, h_copy; + HANDLE h; NTSTATUS status; IO_STATUS_BLOCK io; OBJECT_ATTRIBUTES attr; @@ -4454,25 +4454,21 @@ cwdstuff::set (PUNICODE_STRING nat_cwd, const char *posix_cwd, bool doit) res = -1; goto out; } - /* Workaround a problem in Vista which fails in subsequent calls to - CreateFile with ERROR_INVALID_HANDLE if the handle in + /* Workaround a problem in Vista/Longhorn which fails in subsequent + calls to CreateFile with ERROR_INVALID_HANDLE if the handle in CurrentDirectoryHandle changes without calling SetCurrentDirectory, and the filename given to CreateFile is a relative path. It looks like Vista stores a copy of the CWD handle in some other undocumented place. The NtClose/DuplicateHandle reuses the original handle for the copy of the new handle and the next CreateFile works. Note that this is not thread-safe (yet?) */ - if (!DuplicateHandle (GetCurrentProcess (), h, GetCurrentProcess (), - &h_copy, 0, TRUE, DUPLICATE_SAME_ACCESS)) - { - RtlReleasePebLock (); - __seterrno (); - NtClose (h); - res = -1; - goto out; - } NtClose (*phdl); - dir = *phdl = h; + if (DuplicateHandle (GetCurrentProcess (), h, GetCurrentProcess (), phdl, + 0, TRUE, DUPLICATE_SAME_ACCESS)) + NtClose (h); + else + *phdl = h; + dir = *phdl; /* No need to set path on init. */ if (nat_cwd |