kernelbase: Fix PathAllocCanonicalize handling segments that contain dots.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47766 Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com> Signed-off-by: Jeff Smith <whydoubt@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e83f427a65
commit
c13a8f60bd
|
@ -276,13 +276,8 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Keep the . if one of the following is true:
|
/* Keep the .. if not surrounded by \ */
|
||||||
* 1. PATHCCH_DO_NOT_NORMALIZE_SEGMENTS
|
if ((src[2] != '\\' && src[2]) || (dst > buffer && dst[-1] != '\\'))
|
||||||
* 2. in form of a..b
|
|
||||||
*/
|
|
||||||
if (dst > buffer
|
|
||||||
&& (((flags & PATHCCH_DO_NOT_NORMALIZE_SEGMENTS) && dst[-1] != '\\')
|
|
||||||
|| (dst[-1] != '\\' && src[2] != '\\' && src[2])))
|
|
||||||
{
|
{
|
||||||
*dst++ = *src++;
|
*dst++ = *src++;
|
||||||
*dst++ = *src++;
|
*dst++ = *src++;
|
||||||
|
@ -313,14 +308,8 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Keep the . if one of the following is true:
|
/* Keep the . if not surrounded by \ */
|
||||||
* 1. PATHCCH_DO_NOT_NORMALIZE_SEGMENTS
|
if ((src[1] != '\\' && src[1]) || (dst > buffer && dst[-1] != '\\'))
|
||||||
* 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] == '*')))
|
|
||||||
{
|
{
|
||||||
*dst++ = *src++;
|
*dst++ = *src++;
|
||||||
continue;
|
continue;
|
||||||
|
@ -352,6 +341,22 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
|
||||||
/* End the path */
|
/* End the path */
|
||||||
*dst = 0;
|
*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 result path is empty, fill in \ */
|
||||||
if (!*buffer)
|
if (!*buffer)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue