[PATCH 1/3] kernelbase: PathAllocCanonicalize leave leading dots

Zhiyi Zhang zzhang at codeweavers.com
Wed Sep 18 23:12:40 CDT 2019


Hi Jeff,

Thanks for the work. Your approach is cleaner and cover more test cases.
I made a little modification to your patch to handle . after : better and
merged the tests. I hope that is ok with you.

v2 should supersede 169985~169987 and 169977.

Thanks,
Zhiyi 

On 9/19/19 1:12 AM, Jeff Smith wrote:
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47766
> Signed-off-by: Jeff Smith <whydoubt at gmail.com>
> ---
>  dlls/kernelbase/path.c | 33 ++++++++++++++++++---------------
>  1 file changed, 18 insertions(+), 15 deletions(-)
>
> diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c
> index 3defaf3965..465778f2a1 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,20 @@ 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] == '.')
> +        {
> +            if (dst - 1 > buffer && dst[-2] == '*')
> +                break;
> +            else if (dst - 1 > buffer && dst[-2] == ':' && dst - 2 == root_end)
> +                *--dst = '\\';
> +            else
> +                *--dst = 0;
> +        }
> +    }
> +
>      /* If result path is empty, fill in \ */
>      if (!*buffer)
>      {




More information about the wine-devel mailing list