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@gmail.com wrote:
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47766 Signed-off-by: Jeff Smith whydoubt@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