sal/osl/w32/file_url.cxx | 65 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 11 deletions(-)
New commits: commit e0def896eb9b32f95cb7b00afb92421ee51b8281 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Sat Dec 15 05:57:00 2018 +0100 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Sat Dec 15 16:30:08 2018 +0100 tdf#98343 follow-up: don't fail on UNC prefixes Previously, it used to use FindFirstFile on initial parts of UNC paths, and failed, failing the whole path. Change-Id: Ibc4442e28da17625676695070ed7ddba619f9082 Reviewed-on: https://gerrit.libreoffice.org/65191 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sal/osl/w32/file_url.cxx b/sal/osl/w32/file_url.cxx index 2413efbe2dbb..b096515902ba 100644 --- a/sal/osl/w32/file_url.cxx +++ b/sal/osl/w32/file_url.cxx @@ -362,6 +362,38 @@ static LPWSTR PathAddBackslash(LPWSTR lpPath, sal_uInt32 nBufLen) return lpEndPath; } +// True if the szPath + szFile is just a special prefix, not a path which we may test for existence. +// E.g., \\ or \\server or \\server\share or \\? or \\?\UNC or \\?\UNC\server or \\?\UNC\server\share +static bool IsPathSpecialPrefix(LPWSTR szPath, LPWSTR szFile) +{ + if (szPath[0] == '\\' && szPath[1] == '\\') + { + if (szPath[2] == 0) + return true; // "\\" -> now the server name or "." or "?" will append + else if (szPath[2] == '?' && szPath[3] == '\\') + { + if (szPath[4] == 0) + return wcscmp(szFile, L"UNC") == 0; // "\\?\" -> now "UNC" will append + else + { + if (wcsncmp(szPath + 4, L"UNC\\", 4) == 0) + { + if (szPath[8] == 0) + return true; // "\\?\UNC\" -> now the server name will append + else if (const wchar_t* pBackSlash = wcschr(szPath + 8, '\\')) + return *(pBackSlash + 1) == 0; // "\\?\UNC\Server\" -> now share name will append + } + } + } + else if (szPath[2] != '.') + { + if (const wchar_t* pBackSlash = wcschr(szPath + 2, '\\')) + return *(pBackSlash + 1) == 0; // "\\Server\" -> now share name will append + } + } + return false; +} + // Expects a proper absolute or relative path. NB: It is different from GetLongPathName WinAPI! static DWORD GetCaseCorrectPathNameEx( LPWSTR lpszPath, // path buffer to convert @@ -410,21 +442,32 @@ static DWORD GetCaseCorrectPathNameEx( { if ( bCheckExistence ) { - ::osl::LongPathBuffer< WCHAR > aShortPath( MAX_LONG_PATH ); - wcscpy( aShortPath, lpszPath ); - wcscat( aShortPath, szFile ); - - WIN32_FIND_DATAW aFindFileData; - HANDLE hFind = FindFirstFileW( aShortPath, &aFindFileData ); - if ( IsValidHandle(hFind) ) + if (IsPathSpecialPrefix(lpszPath, szFile)) { - wcscat( lpszPath, aFindFileData.cFileName[0] ? aFindFileData.cFileName : aFindFileData.cAlternateFileName ); - - FindClose( hFind ); + /* add the segment name back */ + wcscat(lpszPath, szFile); } else - lpszPath[0] = 0; + { + osl::LongPathBuffer<WCHAR> aShortPath(MAX_LONG_PATH); + wcscpy(aShortPath, lpszPath); + wcscat(aShortPath, szFile); + + WIN32_FIND_DATAW aFindFileData; + HANDLE hFind = FindFirstFileW(aShortPath, &aFindFileData); + + if (IsValidHandle(hFind)) + { + wcscat(lpszPath, aFindFileData.cFileName[0] + ? aFindFileData.cFileName + : aFindFileData.cAlternateFileName); + + FindClose(hFind); + } + else + lpszPath[0] = 0; + } } else { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits