Commit 2f05b5a6 authored by Andrew Eikum's avatar Andrew Eikum Committed by Alexandre Julliard

shell32: Fix an off-by-one error that causes an infinite loop.

parent afa90e32
...@@ -390,15 +390,23 @@ static BOOL UNIXFS_get_unix_path(LPCWSTR pszDosPath, char *pszCanonicalPath) ...@@ -390,15 +390,23 @@ static BOOL UNIXFS_get_unix_path(LPCWSTR pszDosPath, char *pszCanonicalPath)
/* Append the part relative to the drive symbolic link target. */ /* Append the part relative to the drive symbolic link target. */
lstrcpyW(dospath, pszDosPath); lstrcpyW(dospath, pszDosPath);
dospath_end = dospath + lstrlenW(dospath); 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))){ while(!(pszUnixPath = wine_get_unix_file_name(dospath))){
if(has_failed) if(has_failed){
*dospath_end = '/'; *dospath_end = '/';
else --dospath_end;
}else
has_failed = 1; has_failed = 1;
while(*dospath_end != '\\' && *dospath_end != '/') while(*dospath_end != '\\' && *dospath_end != '/'){
--dospath_end; --dospath_end;
if(dospath_end < dospath)
break;
}
*dospath_end = '\0'; *dospath_end = '\0';
} }
if(dospath_end < dospath)
return FALSE;
strcat(szPath, pszUnixPath + cDriveSymlinkLen); strcat(szPath, pszUnixPath + cDriveSymlinkLen);
HeapFree(GetProcessHeap(), 0, pszUnixPath); HeapFree(GetProcessHeap(), 0, pszUnixPath);
......
...@@ -4062,6 +4062,7 @@ static void test_ParseDisplayNamePBC(void) ...@@ -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}; {'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 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 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); const HRESULT exp_err = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
IShellFolder *psf; IShellFolder *psf;
...@@ -4091,6 +4092,9 @@ static void test_ParseDisplayNamePBC(void) ...@@ -4091,6 +4092,9 @@ static void test_ParseDisplayNamePBC(void)
hres = IShellFolder_ParseDisplayName(psf, NULL, NULL, afileW, NULL, &pidl, NULL); hres = IShellFolder_ParseDisplayName(psf, NULL, NULL, afileW, NULL, &pidl, NULL);
ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */, ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */,
"ParseDisplayName failed with wrong error: 0x%08x\n", hres); "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);
/* fails on unknown dir with IBindCtx with no IFileSystemBindData */ /* fails on unknown dir with IBindCtx with no IFileSystemBindData */
hres = CreateBindCtx(0, &pbc); hres = CreateBindCtx(0, &pbc);
...@@ -4102,6 +4106,9 @@ static void test_ParseDisplayNamePBC(void) ...@@ -4102,6 +4106,9 @@ static void test_ParseDisplayNamePBC(void)
hres = IShellFolder_ParseDisplayName(psf, NULL, pbc, afileW, NULL, &pidl, NULL); hres = IShellFolder_ParseDisplayName(psf, NULL, pbc, afileW, NULL, &pidl, NULL);
ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */, ok(hres == exp_err || broken(hres == E_FAIL) /* NT4 */,
"ParseDisplayName failed with wrong error: 0x%08x\n", hres); "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);
/* unknown dir with IBindCtx with IFileSystemBindData */ /* unknown dir with IBindCtx with IFileSystemBindData */
hres = IBindCtx_RegisterObjectParam(pbc, wFileSystemBindData, (IUnknown*)&fsbd); hres = IBindCtx_RegisterObjectParam(pbc, wFileSystemBindData, (IUnknown*)&fsbd);
...@@ -4126,6 +4133,14 @@ static void test_ParseDisplayNamePBC(void) ...@@ -4126,6 +4133,14 @@ static void test_ParseDisplayNamePBC(void)
ILFree(pidl); 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 */ /* set FIND_DATA struct to NULLs */
pidl = (ITEMIDLIST*)0xdeadbeef; pidl = (ITEMIDLIST*)0xdeadbeef;
fsbdVtbl.GetFindData = fsbd_GetFindData_nul; fsbdVtbl.GetFindData = fsbd_GetFindData_nul;
...@@ -4145,6 +4160,14 @@ static void test_ParseDisplayNamePBC(void) ...@@ -4145,6 +4160,14 @@ static void test_ParseDisplayNamePBC(void)
ILFree(pidl); 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 */ /* set FIND_DATA struct to junk */
pidl = (ITEMIDLIST*)0xdeadbeef; pidl = (ITEMIDLIST*)0xdeadbeef;
fsbdVtbl.GetFindData = fsbd_GetFindData_junk; fsbdVtbl.GetFindData = fsbd_GetFindData_junk;
...@@ -4164,6 +4187,14 @@ static void test_ParseDisplayNamePBC(void) ...@@ -4164,6 +4187,14 @@ static void test_ParseDisplayNamePBC(void)
ILFree(pidl); 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 */ /* set FIND_DATA struct to invalid data */
pidl = (ITEMIDLIST*)0xdeadbeef; pidl = (ITEMIDLIST*)0xdeadbeef;
fsbdVtbl.GetFindData = fsbd_GetFindData_invalid; fsbdVtbl.GetFindData = fsbd_GetFindData_invalid;
...@@ -4183,6 +4214,14 @@ static void test_ParseDisplayNamePBC(void) ...@@ -4183,6 +4214,14 @@ static void test_ParseDisplayNamePBC(void)
ILFree(pidl); 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 */ /* set FIND_DATA struct to valid data */
pidl = (ITEMIDLIST*)0xdeadbeef; pidl = (ITEMIDLIST*)0xdeadbeef;
fsbdVtbl.GetFindData = fsbd_GetFindData_valid; fsbdVtbl.GetFindData = fsbd_GetFindData_valid;
...@@ -4202,6 +4241,14 @@ static void test_ParseDisplayNamePBC(void) ...@@ -4202,6 +4241,14 @@ static void test_ParseDisplayNamePBC(void)
ILFree(pidl); 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); IBindCtx_Release(pbc);
IShellFolder_Release(psf); IShellFolder_Release(psf);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment