Cygwin: fix return value of symlink_info::check

Currently it is possible for symlink_info::check to return -1 in case
we're searching for foo and find foo.lnk that is not a Cygwin symlink.
This contradicts the new meaning attached to a negative return value
in commit 19d59ce75d.  Fix this by setting "res" to 0 at the beginning
of the main loop and not seting it to -1 later.

Also fix the commentary preceding the function definition to reflect
the current behavior.

Addresses: https://cygwin.com/pipermail/cygwin/2022-August/252030.html
This commit is contained in:
Ken Brown 2022-08-09 15:14:07 -04:00
parent 34872ce1a1
commit 5cdf8ade28
2 changed files with 13 additions and 13 deletions

View File

@ -3027,19 +3027,16 @@ symlink_info::parse_device (const char *contents)
/* Check if PATH is a symlink. PATH must be a valid Win32 path name.
If PATH is a symlink, put the value of the symlink--the file to
which it points--into BUF. The value stored in BUF is not
necessarily null terminated. BUFLEN is the length of BUF; only up
to BUFLEN characters will be stored in BUF. BUF may be NULL, in
which case nothing will be stored.
which it points--into CONTENTS.
Set *SYML if PATH is a symlink.
Set PATH_SYMLINK if PATH is a symlink.
Set *EXEC if PATH appears to be executable. This is an efficiency
hack because we sometimes have to open the file anyhow. *EXEC will
not be set for every executable file.
Return -1 on error, 0 if PATH is not a symlink, or the length
stored into BUF if PATH is a symlink. */
If PATH is a symlink, return the length stored into CONTENTS. If
the inner components of PATH contain native symlinks or junctions,
or if the drive is a virtual drive, compare PATH with the result
returned by GetFinalPathNameByHandleA. If they differ, store the
final path in CONTENTS and return the negative of its length. In
all other cases, return 0. */
int
symlink_info::check (char *path, const suffix_info *suffixes, fs_info &fs,
@ -3094,6 +3091,7 @@ restart:
while (suffix.next ())
{
res = 0;
error = 0;
get_nt_native_path (suffix.path, upath, mount_flags & MOUNT_DOS);
if (h)
@ -3345,8 +3343,6 @@ restart:
continue;
}
res = -1;
/* Reparse points are potentially symlinks. This check must be
performed before checking the SYSTEM attribute for sysfile
symlinks, since reparse points can have this flag set, too. */

View File

@ -35,3 +35,7 @@ Bug Fixes
- Fix a problem that prevented some symbolic links to /cygdrive/C,
/cygdrive/./c, /cygdrive//c, etc. from working.
Addresses: https://cygwin.com/pipermail/cygwin/2022-July/251994.html
- Fix a path handling bug that could cause a non-existing file to be
treated as the current directory.
Addresses: https://cygwin.com/pipermail/cygwin/2022-August/252030.html