Jeremy White : kernel32: Revise GetLongPathNameA to avoid overriding the input on long names.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Dec 24 14:40:05 CST 2015


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

Author: Jeremy White <jwhite at codeweavers.com>
Date:   Mon Dec 21 15:20:13 2015 -0600

kernel32: Revise GetLongPathNameA to avoid overriding the input on long names.

Signed-off-by: Jeremy White <jwhite at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/path.c       | 10 ++++++++--
 dlls/kernel32/tests/path.c |  1 -
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index ae211cc..b12c71e 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -292,6 +292,7 @@ DWORD WINAPI GetLongPathNameW( LPCWSTR shortpath, LPWSTR longpath, DWORD longlen
     BOOL                unixabsolute;
     WIN32_FIND_DATAW    wfd;
     HANDLE              goit;
+    BOOL                is_legal_8dot3;
 
     if (!shortpath)
     {
@@ -365,7 +366,7 @@ DWORD WINAPI GetLongPathNameW( LPCWSTR shortpath, LPWSTR longpath, DWORD longlen
             }
         }
 
-        /* Check if the file exists and use the existing file name */
+        /* Check if the file exists */
         goit = FindFirstFileW(tmplongpath, &wfd);
         if (goit == INVALID_HANDLE_VALUE)
         {
@@ -374,7 +375,12 @@ DWORD WINAPI GetLongPathNameW( LPCWSTR shortpath, LPWSTR longpath, DWORD longlen
             return 0;
         }
         FindClose(goit);
-        strcpyW(tmplongpath + lp, wfd.cFileName);
+
+        is_legal_8dot3 = FALSE;
+        CheckNameLegalDOS8Dot3W(tmplongpath + lp, NULL, 0, NULL, &is_legal_8dot3);
+        /* Use the existing file name if it's a short name */
+        if (is_legal_8dot3)
+            strcpyW(tmplongpath + lp, wfd.cFileName);
         lp += strlenW(tmplongpath + lp);
         sp += tmplen;
     }
diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c
index 9475aa0..830c93d 100644
--- a/dlls/kernel32/tests/path.c
+++ b/dlls/kernel32/tests/path.c
@@ -868,7 +868,6 @@ static void test_PathNameA(CHAR *curdir, CHAR curDrive, CHAR otherDrive)
        "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr);
     tmpstr[len] = tolower(tmpstr[len]);
     ok(GetLongPathNameA(tmpstr,tmpstr1,MAX_PATH),"GetLongPathNameA failed\n");
-    todo_wine
     ok(lstrcmpA(tmpstr,tmpstr1)==0,
        "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr);
     sprintf(tmpstr,"%s/%s",SHORTDIR,SHORTFILE);




More information about the wine-cvs mailing list