On 9/21/2019 1:34 PM, Ken Brown wrote:
> Prior to commit b0717aae, path_conv::check had the following code:
>
>if (strncmp (path, ".\\", 4))
> {
>/* Windows ignores trailing dots and spaces in the last path
> component, and ignores exactly one trailing dot in inner
> path components. */
>char *tail = NULL;
>[...]
>if (!tail || tail == path)
> /* nothing */;
>else if (tail[-1] != '\\')
> {
>*tail = '\0';
>[...]
> }
>
> Commit b0717aae0 intended to disable this code, but it inadvertently
> disabled only part of it. In particular, the declaration of the local
> tail variable was in the disabled code, but the following remained:
>
>if (!tail || tail == path)
> /* nothing */;
>else if (tail[-1] != '\\')
> {
>*tail = '\0';
>[...]
> }
>
> [A later commit removed the disabled code.]
>
> The tail variable here points into a string different from path,
> causing that string to be truncated under some circumstances. See
>
>https://cygwin.com/ml/cygwin/2019-09/msg1.html
>
> for more details.
>
> This commit fixes the problem by removing the leftover code
> that was intended to be removed in b0717aae.
> ---
> winsup/cygwin/path.cc | 13 -
> 1 file changed, 13 deletions(-)
>
> diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
> index c13701aa0..2fbacd881 100644
> --- a/winsup/cygwin/path.cc
> +++ b/winsup/cygwin/path.cc
> @@ -1168,19 +1168,6 @@ path_conv::check (const char *src, unsigned opt,
>
> if (dev.isfs ())
> {
> - if (strncmp (path, ".\\", 4))
> - {
> - if (!tail || tail == path)
> - /* nothing */;
> - else if (tail[-1] != '\\')
> - *tail = '\0';
> - else
> - {
> - error = ENOENT;
> - return;
> - }
> - }
> -
> /* If FS hasn't been checked already in symlink_info::check,
>do so now. */
> if (fs.inited ()|| fs.update (get_nt_native_path (), NULL))
This seems pretty straightforward to me, but I'll wait a few days before
committing it in case I'm missing something.
Ken