Peter Beutner : kernel32: Properly handle double delimiters in GetShortPathName/GetLongPathName.

Alexandre Julliard julliard at winehq.org
Mon Aug 15 10:37:30 CDT 2016


Module: wine
Branch: master
Commit: c90e46b66ded518dbfb88f1efdc366e7986defb4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c90e46b66ded518dbfb88f1efdc366e7986defb4

Author: Peter Beutner <p.beutner at 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 at gmx.net>
Signed-off-by: Alexandre Julliard <julliard at 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("..");




More information about the wine-cvs mailing list