Cygwin: path_conv: Try to handle native symlinks more sanely

For local paths, add a check if the inner path components contain native
symlinks or junctions.  Compare the incoming path with the path returned
by NtQueryInformationFile(FileNameInformation).  If they differ, there
must be at least one native symlink or junction in the path.  If so,
treat the currently evaluated file as non-existant.  This forces
path_conv::check to backtrack inner path components until we eliminated
all native symlinks or junctions and have a normalized path.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2021-04-19 14:49:14 +02:00
parent 183e5f0a15
commit 456c3a4638
1 changed files with 26 additions and 0 deletions

View File

@ -3179,6 +3179,32 @@ restart:
status = conv_hdl.get_finfo (h, fs.is_nfs ()); status = conv_hdl.get_finfo (h, fs.is_nfs ());
if (NT_SUCCESS (status)) if (NT_SUCCESS (status))
fileattr = conv_hdl.get_dosattr (fs.is_nfs ()); fileattr = conv_hdl.get_dosattr (fs.is_nfs ());
/* For local paths, check if the inner path components contain
native symlinks or junctions. Compare incoming path with
path returned by NtQueryInformationFile(FileNameInformation).
If they differ, bail out as if the file doesn't exist. This
forces path_conv::check to backtrack inner path components. */
if (!fs.is_remote_drive ())
{
PFILE_NAME_INFORMATION pfni = (PFILE_NAME_INFORMATION)
tp.c_get ();
if (NT_SUCCESS (NtQueryInformationFile (h, &io, pfni, NT_MAX_PATH,
FileNameInformation)))
{
UNICODE_STRING npath;
RtlInitCountedUnicodeString (&npath, pfni->FileName,
pfni->FileNameLength);
if (!RtlEqualUnicodePathSuffix (&upath, &npath, !!ci_flag))
{
fileattr = INVALID_FILE_ATTRIBUTES;
set_error (ENOENT);
break;
}
}
}
} }
if (!NT_SUCCESS (status)) if (!NT_SUCCESS (status))
{ {