* path.cc (cwdstuff::set): Revert error handling change in case
DuplicateHandle fails, because it breaks Vista/Longhorn workaround.
This commit is contained in:
parent
6532abb624
commit
44464b0156
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user