Cygwin: cwdstuff: check if /dev exists

/dev has been handled as virtual dir in cwdstuff, thus not allowing
to start native apps from /dev as CWD, even if /dev actually exists
on disk.  Unfortunately this also affects Cygwin executables started
from a debugger.

When chdir'ing to /dev, check if /dev exists on disk.  If so, treat
it as any other existing path.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2021-05-25 21:46:13 +02:00
parent efef4b8bf1
commit 4c09dc4f9c
1 changed files with 18 additions and 2 deletions

View File

@ -4886,6 +4886,7 @@ cwdstuff::set (path_conv *nat_cwd, const char *posix_cwd)
{
NTSTATUS status;
UNICODE_STRING upath;
OBJECT_ATTRIBUTES attr;
PEB &peb = *NtCurrentTeb ()->Peb;
bool virtual_path = false;
bool unc_path = false;
@ -4927,7 +4928,23 @@ cwdstuff::set (path_conv *nat_cwd, const char *posix_cwd)
{
upath = *nat_cwd->get_nt_native_path ();
if (nat_cwd->isspecial ())
virtual_path = true;
{
virtual_path = true;
/* But allow starting of native apps from /dev if /dev actually
exists on disk. */
if (isdev_dev (nat_cwd->dev))
{
FILE_BASIC_INFORMATION fbi;
InitializeObjectAttributes (&attr, &upath,
OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
NULL, NULL);
status = NtQueryAttributesFile (&attr, &fbi);
if (status != STATUS_OBJECT_NAME_NOT_FOUND
&& status != STATUS_OBJECT_PATH_NOT_FOUND)
virtual_path = false;
}
}
}
/* Memorize old DismountCount before opening the dir. This value is
@ -4944,7 +4961,6 @@ cwdstuff::set (path_conv *nat_cwd, const char *posix_cwd)
if (!virtual_path)
{
IO_STATUS_BLOCK io;
OBJECT_ATTRIBUTES attr;
if (!nat_cwd)
{