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/msg00001.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

Reply via email to