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>
This commit is contained in:
parent
1fe0b84ffc
commit
c90e46b66d
|
@ -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);
|
||||
|
|
|
@ -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("..");
|
||||
|
|
Loading…
Reference in New Issue