* path.cc (cwdstuff::set): Revert error handling change in case

DuplicateHandle fails, because it breaks Vista/Longhorn workaround.
This commit is contained in:
Corinna Vinschen 2008-02-20 14:42:29 +00:00
parent 6532abb624
commit 44464b0156
2 changed files with 14 additions and 13 deletions

View File

@ -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> 2008-02-19 Christopher Faylor <me+cygwin@cgf.cx>
* sigproc.cc (sig_send): Use sigmask of target thread if it is * sigproc.cc (sig_send): Use sigmask of target thread if it is

View File

@ -4429,7 +4429,7 @@ cwdstuff::set (PUNICODE_STRING nat_cwd, const char *posix_cwd, bool doit)
- Unlinking a cwd fails because SetCurrentDirectory seems to - Unlinking a cwd fails because SetCurrentDirectory seems to
open directories so that deleting the directory is disallowed. open directories so that deleting the directory is disallowed.
The below code opens with *all* sharing flags set. */ The below code opens with *all* sharing flags set. */
HANDLE h, h_copy; HANDLE h;
NTSTATUS status; NTSTATUS status;
IO_STATUS_BLOCK io; IO_STATUS_BLOCK io;
OBJECT_ATTRIBUTES attr; OBJECT_ATTRIBUTES attr;
@ -4454,25 +4454,21 @@ cwdstuff::set (PUNICODE_STRING nat_cwd, const char *posix_cwd, bool doit)
res = -1; res = -1;
goto out; goto out;
} }
/* Workaround a problem in Vista which fails in subsequent calls to /* Workaround a problem in Vista/Longhorn which fails in subsequent
CreateFile with ERROR_INVALID_HANDLE if the handle in calls to CreateFile with ERROR_INVALID_HANDLE if the handle in
CurrentDirectoryHandle changes without calling SetCurrentDirectory, CurrentDirectoryHandle changes without calling SetCurrentDirectory,
and the filename given to CreateFile is a relative path. It looks 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 like Vista stores a copy of the CWD handle in some other undocumented
place. The NtClose/DuplicateHandle reuses the original handle for place. The NtClose/DuplicateHandle reuses the original handle for
the copy of the new handle and the next CreateFile works. the copy of the new handle and the next CreateFile works.
Note that this is not thread-safe (yet?) */ 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); 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. */ /* No need to set path on init. */
if (nat_cwd if (nat_cwd