shell32: Fix an off-by-one error that causes an infinite loop.
This commit is contained in:
parent
afa90e325e
commit
2f05b5a6d9
|
@ -390,15 +390,23 @@ static BOOL UNIXFS_get_unix_path(LPCWSTR pszDosPath, char *pszCanonicalPath)
|
|||
/* Append the part relative to the drive symbolic link target. */
|
||||
lstrcpyW(dospath, pszDosPath);
|
||||
dospath_end = dospath + lstrlenW(dospath);
|
||||
/* search for the most valid UNIX path possible, then append missing
|
||||
* path parts */
|
||||
while(!(pszUnixPath = wine_get_unix_file_name(dospath))){
|
||||
if(has_failed)
|
||||
if(has_failed){
|
||||
*dospath_end = '/';
|
||||
else
|
||||
has_failed = 1;
|
||||
while(*dospath_end != '\\' && *dospath_end != '/')
|
||||
--dospath_end;
|
||||
}else
|
||||
has_failed = 1;
|
||||
while(*dospath_end != '\\' && *dospath_end != '/'){
|
||||
--dospath_end;
|
||||
if(dospath_end < dospath)
|
||||
break;
|
||||
}
|
||||
*dospath_end = '\0';
|
||||
}
|
||||
if(dospath_end < dospath)
|
||||
return FALSE;
|
||||
strcat(szPath, pszUnixPath + cDriveSymlinkLen);
|
||||
HeapFree(GetProcessHeap(), 0, pszUnixPath);
|
||||
|
||||
|
|
|
@ -4062,6 +4062,7 @@ static void test_ParseDisplayNamePBC(void)
|
|||
{'F','i','l','e',' ','S','y','s','t','e','m',' ','B','i','n','d',' ','D','a','t','a',0};
|
||||
WCHAR adirW[] = {'C',':','\\','f','s','b','d','d','i','r',0};
|
||||
WCHAR afileW[] = {'C',':','\\','f','s','b','d','d','i','r','\\','f','i','l','e','.','t','x','t',0};
|
||||
WCHAR afile2W[] = {'C',':','\\','f','s','b','d','d','i','r','\\','s','\\','f','i','l','e','.','t','x','t',0};
|
||||
const HRESULT exp_err = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
|
||||
|
||||
IShellFolder *psf;
|
||||
|
@ -4089,6 +4090,9 @@ static void test_ParseDisplayNamePBC(void)
|
|||
ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed with wrong error: 0x%08x\n", hres);
|
||||
hres = IShellFolder_ParseDisplayName(psf, NULL, NULL, afileW, NULL, &pidl, NULL);
|
||||
ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed with wrong error: 0x%08x\n", hres);
|
||||
hres = IShellFolder_ParseDisplayName(psf, NULL, NULL, afile2W, NULL, &pidl, NULL);
|
||||
ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed with wrong error: 0x%08x\n", hres);
|
||||
|
||||
|
@ -4100,6 +4104,9 @@ static void test_ParseDisplayNamePBC(void)
|
|||
ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed with wrong error: 0x%08x\n", hres);
|
||||
hres = IShellFolder_ParseDisplayName(psf, NULL, pbc, afileW, NULL, &pidl, NULL);
|
||||
ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed with wrong error: 0x%08x\n", hres);
|
||||
hres = IShellFolder_ParseDisplayName(psf, NULL, pbc, afile2W, NULL, &pidl, NULL);
|
||||
ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed with wrong error: 0x%08x\n", hres);
|
||||
|
||||
|
@ -4126,6 +4133,14 @@ static void test_ParseDisplayNamePBC(void)
|
|||
ILFree(pidl);
|
||||
}
|
||||
|
||||
hres = IShellFolder_ParseDisplayName(psf, NULL, pbc, afile2W, NULL, &pidl, NULL);
|
||||
ok(hres == S_OK || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed: 0x%08x\n", hres);
|
||||
if(SUCCEEDED(hres)){
|
||||
verify_pidl(pidl, afile2W);
|
||||
ILFree(pidl);
|
||||
}
|
||||
|
||||
/* set FIND_DATA struct to NULLs */
|
||||
pidl = (ITEMIDLIST*)0xdeadbeef;
|
||||
fsbdVtbl.GetFindData = fsbd_GetFindData_nul;
|
||||
|
@ -4145,6 +4160,14 @@ static void test_ParseDisplayNamePBC(void)
|
|||
ILFree(pidl);
|
||||
}
|
||||
|
||||
hres = IShellFolder_ParseDisplayName(psf, NULL, pbc, afile2W, NULL, &pidl, NULL);
|
||||
ok(hres == S_OK || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed: 0x%08x\n", hres);
|
||||
if(SUCCEEDED(hres)){
|
||||
verify_pidl(pidl, afile2W);
|
||||
ILFree(pidl);
|
||||
}
|
||||
|
||||
/* set FIND_DATA struct to junk */
|
||||
pidl = (ITEMIDLIST*)0xdeadbeef;
|
||||
fsbdVtbl.GetFindData = fsbd_GetFindData_junk;
|
||||
|
@ -4164,6 +4187,14 @@ static void test_ParseDisplayNamePBC(void)
|
|||
ILFree(pidl);
|
||||
}
|
||||
|
||||
hres = IShellFolder_ParseDisplayName(psf, NULL, pbc, afile2W, NULL, &pidl, NULL);
|
||||
ok(hres == S_OK || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed: 0x%08x\n", hres);
|
||||
if(SUCCEEDED(hres)){
|
||||
verify_pidl(pidl, afile2W);
|
||||
ILFree(pidl);
|
||||
}
|
||||
|
||||
/* set FIND_DATA struct to invalid data */
|
||||
pidl = (ITEMIDLIST*)0xdeadbeef;
|
||||
fsbdVtbl.GetFindData = fsbd_GetFindData_invalid;
|
||||
|
@ -4183,6 +4214,14 @@ static void test_ParseDisplayNamePBC(void)
|
|||
ILFree(pidl);
|
||||
}
|
||||
|
||||
hres = IShellFolder_ParseDisplayName(psf, NULL, pbc, afile2W, NULL, &pidl, NULL);
|
||||
ok(hres == S_OK || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed: 0x%08x\n", hres);
|
||||
if(SUCCEEDED(hres)){
|
||||
verify_pidl(pidl, afile2W);
|
||||
ILFree(pidl);
|
||||
}
|
||||
|
||||
/* set FIND_DATA struct to valid data */
|
||||
pidl = (ITEMIDLIST*)0xdeadbeef;
|
||||
fsbdVtbl.GetFindData = fsbd_GetFindData_valid;
|
||||
|
@ -4202,6 +4241,14 @@ static void test_ParseDisplayNamePBC(void)
|
|||
ILFree(pidl);
|
||||
}
|
||||
|
||||
hres = IShellFolder_ParseDisplayName(psf, NULL, pbc, afile2W, NULL, &pidl, NULL);
|
||||
ok(hres == S_OK || broken(hres == E_FAIL) /* NT4 */,
|
||||
"ParseDisplayName failed: 0x%08x\n", hres);
|
||||
if(SUCCEEDED(hres)){
|
||||
verify_pidl(pidl, afile2W);
|
||||
ILFree(pidl);
|
||||
}
|
||||
|
||||
IBindCtx_Release(pbc);
|
||||
IShellFolder_Release(psf);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue