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>
This commit is contained in:
Jeremy White 2015-12-21 15:20:13 -06:00 committed by Alexandre Julliard
parent ee1260e0d2
commit 7dea64279e
2 changed files with 8 additions and 3 deletions

View File

@ -292,6 +292,7 @@ DWORD WINAPI GetLongPathNameW( LPCWSTR shortpath, LPWSTR longpath, DWORD longlen
BOOL unixabsolute; BOOL unixabsolute;
WIN32_FIND_DATAW wfd; WIN32_FIND_DATAW wfd;
HANDLE goit; HANDLE goit;
BOOL is_legal_8dot3;
if (!shortpath) 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); goit = FindFirstFileW(tmplongpath, &wfd);
if (goit == INVALID_HANDLE_VALUE) if (goit == INVALID_HANDLE_VALUE)
{ {
@ -374,7 +375,12 @@ DWORD WINAPI GetLongPathNameW( LPCWSTR shortpath, LPWSTR longpath, DWORD longlen
return 0; return 0;
} }
FindClose(goit); 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); lp += strlenW(tmplongpath + lp);
sp += tmplen; sp += tmplen;
} }

View File

@ -868,7 +868,6 @@ static void test_PathNameA(CHAR *curdir, CHAR curDrive, CHAR otherDrive)
"GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr);
tmpstr[len] = tolower(tmpstr[len]); tmpstr[len] = tolower(tmpstr[len]);
ok(GetLongPathNameA(tmpstr,tmpstr1,MAX_PATH),"GetLongPathNameA failed\n"); ok(GetLongPathNameA(tmpstr,tmpstr1,MAX_PATH),"GetLongPathNameA failed\n");
todo_wine
ok(lstrcmpA(tmpstr,tmpstr1)==0, ok(lstrcmpA(tmpstr,tmpstr1)==0,
"GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr);
sprintf(tmpstr,"%s/%s",SHORTDIR,SHORTFILE); sprintf(tmpstr,"%s/%s",SHORTDIR,SHORTFILE);