Module: wine Branch: master Commit: 7dea64279ee9b80a44c2eca9ed72b1ce57f64fe8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7dea64279ee9b80a44c2eca9ed...
Author: Jeremy White jwhite@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);