[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