[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