Module: wine Branch: master Commit: c90e46b66ded518dbfb88f1efdc366e7986defb4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c90e46b66ded518dbfb88f1efd...
Author: Peter Beutner p.beutner@gmx.net Date: Sun Aug 14 22:04:50 2016 +0200
kernel32: Properly handle double delimiters in GetShortPathName/GetLongPathName.
Signed-off-by: Peter Beutner p.beutner@gmx.net Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/path.c | 27 ++------------------------- dlls/kernel32/tests/path.c | 10 ---------- 2 files changed, 2 insertions(+), 35 deletions(-)
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c index 620401d..eadd2e7 100644 --- a/dlls/kernel32/path.c +++ b/dlls/kernel32/path.c @@ -335,23 +335,12 @@ DWORD WINAPI GetLongPathNameW( LPCWSTR shortpath, LPWSTR longpath, DWORD longlen /* check for path delimiters and reproduce them */ if (shortpath[sp] == '\' || shortpath[sp] == '/') { - if (!lp || (tmplongpath[lp-1] != '\' && tmplongpath[lp-1] != '/')) - { - /* strip double delimiters */ - tmplongpath[lp++] = shortpath[sp]; - } + tmplongpath[lp++] = shortpath[sp++]; tmplongpath[lp] = 0; /* terminate string */ - sp++; continue; }
p = shortpath + sp; - if (sp == 0 && p[0] == '.' && (p[1] == '/' || p[1] == '\')) - { - tmplongpath[lp++] = *p++; - tmplongpath[lp++] = *p++; - sp += 2; - } for (; *p && *p != '/' && *p != '\'; p++); tmplen = p - (shortpath + sp); lstrcpynW(tmplongpath + lp, shortpath + sp, tmplen + 1); @@ -498,24 +487,12 @@ DWORD WINAPI GetShortPathNameW( LPCWSTR longpath, LPWSTR shortpath, DWORD shortl /* check for path delimiters and reproduce them */ if (longpath[lp] == '\' || longpath[lp] == '/') { - if (!sp || (tmpshortpath[sp-1] != '\' && tmpshortpath[sp-1] != '/')) - { - /* strip double delimiters */ - tmpshortpath[sp] = longpath[lp]; - sp++; - } + tmpshortpath[sp++] = longpath[lp++]; tmpshortpath[sp] = 0; /* terminate string */ - lp++; continue; }
p = longpath + lp; - if (lp == 0 && p[0] == '.' && (p[1] == '/' || p[1] == '\')) - { - tmpshortpath[sp++] = *p++; - tmpshortpath[sp++] = *p++; - lp += 2; - } for (; *p && *p != '/' && *p != '\'; p++); tmplen = p - (longpath + lp); lstrcpynW(tmpshortpath + sp, longpath + lp, tmplen + 1); diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c index 764141d..7eb9e75 100644 --- a/dlls/kernel32/tests/path.c +++ b/dlls/kernel32/tests/path.c @@ -949,31 +949,23 @@ static void test_PathNameA(CHAR *curdir, CHAR curDrive, CHAR otherDrive) /* test double delimiters */ sprintf(tmpstr,"%s\\%s", SHORTDIR,SHORTFILE); ok(GetShortPathNameA(tmpstr,tmpstr1,MAX_PATH),"GetShortPathNameA failed\n"); - todo_wine ok(lstrcmpiA(tmpstr,tmpstr1)==0, "GetShortPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); sprintf(tmpstr,".\\%s\\%s", SHORTDIR,SHORTFILE); - todo_wine - { ok(GetShortPathNameA(tmpstr,tmpstr1,MAX_PATH),"GetShortPathNameA failed\n"); ok(lstrcmpiA(tmpstr,tmpstr1)==0, "GetShortPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); - }
if (pGetLongPathNameA) { sprintf(tmpstr,"%s\\%s",LONGDIR,LONGFILE); ok(pGetLongPathNameA(tmpstr,tmpstr1,MAX_PATH),"GetLongPathNameA failed\n"); - todo_wine ok(lstrcmpiA(tmpstr,tmpstr1)==0, "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr);
sprintf(tmpstr,".\\%s\\%s",LONGDIR,LONGFILE); - todo_wine - { ok(pGetLongPathNameA(tmpstr,tmpstr1,MAX_PATH),"GetLongPathNameA failed\n"); ok(lstrcmpiA(tmpstr,tmpstr1)==0, "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); - } } }
@@ -2204,12 +2196,10 @@ static void test_relative_path(void) strcpy(buf, "deadbeef"); ret = pGetLongPathNameA("..\\foo\file", buf, MAX_PATH); ok(ret, "GetLongPathName error %d\n", GetLastError()); - todo_wine ok(!strcmp(buf, "..\\foo\file"), "expected ..\\foo\file, got %s\n", buf); strcpy(buf, "deadbeef"); ret = GetShortPathNameA("..\\foo\file", buf, MAX_PATH); ok(ret, "GetShortPathName error %d\n", GetLastError()); - todo_wine ok(!strcmp(buf, "..\\foo\file"), "expected ..\\foo\file, got %s\n", buf);
SetCurrentDirectoryA("..");