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

Jeff Smith whydoubt at gmail.com
Wed Sep 18 12:17:50 CDT 2019


This is an alternative solution to the one submitted by Zhiyi Zhang.
The second patch in this series contains the tests from Zhiyi Zhang's patch.
The third patch contains additional tests, including some that do not
pass using Zhiyi Zhang's patch.

 -- Jeff


-- Jeff

On Wed, Sep 18, 2019 at 12:12 PM Jeff Smith <whydoubt at gmail.com> 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)
>      {
> --
> 2.21.0
>



More information about the wine-devel mailing list