[PATCH v2 1/2] kernelbase: Fix PathAllocCanonicalize handling segments that contain dots.

Jeff Smith whydoubt at gmail.com
Wed Sep 18 23:50:24 CDT 2019


The minor edit you made looks fine to me.

Signed-off-by: Jeff Smith <whydoubt at gmail.com>

On Wed, Sep 18, 2019 at 11:05 PM Zhiyi Zhang <zzhang at codeweavers.com> wrote:
>
> From: Jeff Smith <whydoubt at gmail.com>
>
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47766
> Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
> ---
>  dlls/kernelbase/path.c | 35 ++++++++++++++++++++---------------
>  1 file changed, 20 insertions(+), 15 deletions(-)
>
> diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c
> index 82708be544..e9182a764d 100644
> --- a/dlls/kernelbase/path.c
> +++ b/dlls/kernelbase/path.c
> @@ -276,13 +276,8 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
>                      continue;
>                  }
>
> -                /* Keep the . if one of the following is true:
> -                 * 1. PATHCCH_DO_NOT_NORMALIZE_SEGMENTS
> -                 * 2. in form of a..b
> -                 */
> -                if (dst > buffer
> -                    && (((flags & PATHCCH_DO_NOT_NORMALIZE_SEGMENTS) && dst[-1] != '\\')
> -                        || (dst[-1] != '\\' && src[2] != '\\' && src[2])))
> +                /* Keep the .. if not surrounded by \ */
> +                if ((src[2] != '\\' && src[2]) || (dst > buffer && dst[-1] != '\\'))
>                  {
>                      *dst++ = *src++;
>                      *dst++ = *src++;
> @@ -313,14 +308,8 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
>              }
>              else
>              {
> -                /* Keep the . if one of the following is true:
> -                 * 1. PATHCCH_DO_NOT_NORMALIZE_SEGMENTS
> -                 * 2. in form of a.b, which is used in domain names
> -                 * 3. *.
> -                 */
> -                if (dst > buffer
> -                    && ((flags & PATHCCH_DO_NOT_NORMALIZE_SEGMENTS && dst[-1] != '\\')
> -                        || (dst[-1] != '\\' && src[1] != '\\' && src[1]) || (dst[-1] == '*')))
> +                /* Keep the . if not surrounded by \ */
> +                if ((src[1] != '\\' && src[1]) || (dst > buffer && dst[-1] != '\\'))
>                  {
>                      *dst++ = *src++;
>                      continue;
> @@ -352,6 +341,22 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
>      /* End the path */
>      *dst = 0;
>
> +    /* Strip multiple trailing . */
> +    if (!(flags & PATHCCH_DO_NOT_NORMALIZE_SEGMENTS))
> +    {
> +        while (dst > buffer && dst[-1] == '.')
> +        {
> +            /* Keep a . after * */
> +            if (dst - 1 > buffer && dst[-2] == '*')
> +                break;
> +            /* If . follow a : at the second character, remove the . and add a \ */
> +            else if (dst - 1 > buffer && dst[-2] == ':' && dst - 2 == buffer + 1)
> +                *--dst = '\\';
> +            else
> +                *--dst = 0;
> +        }
> +    }
> +
>      /* If result path is empty, fill in \ */
>      if (!*buffer)
>      {
> --
> 2.23.0
>
>
>



More information about the wine-devel mailing list