From: Joel Rosdahl Date: Sun, 21 Jun 2020 19:29:04 +0000 (+0200) Subject: Remove win32 GetFileNameFromHandle compatibility function X-Git-Tag: v4.0~386 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=98ba73db1984d4ea995759bdbf3f94cf16200d5a;p=thirdparty%2Fccache.git Remove win32 GetFileNameFromHandle compatibility function The replacement function seems to be buggy, triggering failures in x_realpath at least when the unit tests are run in Wine. The real GetFinalPathNameByHandle function is allegedly supported in Windows Vista and newer, so let’s just use it. (cherry picked from commit bd742fbe20493f720ae6af00525fd3a8ee829802) --- diff --git a/cmake/GenerateConfigurationFile.cmake b/cmake/GenerateConfigurationFile.cmake index b698c4fc4..0ef550728 100644 --- a/cmake/GenerateConfigurationFile.cmake +++ b/cmake/GenerateConfigurationFile.cmake @@ -20,7 +20,6 @@ include(CheckFunctionExists) set(functions asctime_r geteuid - GetFinalPathNameByHandleW getopt_long getpwuid gettimeofday diff --git a/cmake/config.h.in b/cmake/config.h.in index c2e76b94e..4eeecdd8b 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -63,9 +63,6 @@ /* Define to 1 if you have the `geteuid' function. */ #cmakedefine HAVE_GETEUID -/* Define to 1 if you have the `GetFinalPathNameByHandleW' function. */ -#cmakedefine HAVE_GETFINALPATHNAMEBYHANDLEW - /* Define to 1 if you have the `getopt_long' function. */ #cmakedefine HAVE_GETOPT_LONG diff --git a/src/Util.cpp b/src/Util.cpp index a4fa05416..9c12e342f 100644 --- a/src/Util.cpp +++ b/src/Util.cpp @@ -676,13 +676,12 @@ real_path(const std::string& path, bool return_empty_on_error) FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != path_handle) { -# ifdef HAVE_GETFINALPATHNAMEBYHANDLEW - GetFinalPathNameByHandle( + bool ok = GetFinalPathNameByHandle( path_handle, buffer, buffer_size, FILE_NAME_NORMALIZED); -# else - GetFileNameFromHandle(path_handle, buffer, buffer_size); -# endif CloseHandle(path_handle); + if (!ok) { + return path; + } resolved = buffer + 4; // Strip \\?\ from the file name. } else { snprintf(buffer, buffer_size, "%s", c_path); diff --git a/src/win32compat.cpp b/src/win32compat.cpp index 5da56c179..27d9a6bb3 100644 --- a/src/win32compat.cpp +++ b/src/win32compat.cpp @@ -20,10 +20,6 @@ #ifdef _WIN32 -# include -# include -# include - std::string win32_error_message(DWORD error_code) { @@ -42,79 +38,4 @@ win32_error_message(DWORD error_code) return message; } -# if !defined(HAVE_REALPATH) && !defined(HAVE_GETFINALPATHNAMEBYHANDLEW) -BOOL -GetFileNameFromHandle(HANDLE file_handle, TCHAR* filename, WORD cch_filename) -{ - BOOL success = FALSE; - - // Get the file size. - DWORD file_size_hi = 0; - DWORD file_size_lo = GetFileSize(file_handle, &file_size_hi); - if (file_size_lo == 0 && file_size_hi == 0) { - // Cannot map a file with a length of zero. - return FALSE; - } - - // Create a file mapping object. - HANDLE file_map = - CreateFileMapping(file_handle, NULL, PAGE_READONLY, 0, 1, NULL); - if (!file_map) { - return FALSE; - } - - // Create a file mapping to get the file name. - void* mem = MapViewOfFile(file_map, FILE_MAP_READ, 0, 0, 1); - if (mem) { - if (GetMappedFileName(GetCurrentProcess(), mem, filename, cch_filename)) { - // Translate path with device name to drive letters. - TCHAR temp[512]; - temp[0] = '\0'; - - if (GetLogicalDriveStrings(512 - 1, temp)) { - TCHAR name[MAX_PATH]; - TCHAR drive[3] = TEXT(" :"); - BOOL found = FALSE; - TCHAR* p = temp; - - do { - // Copy the drive letter to the template string. - *drive = *p; - - // Look up each device name. - if (QueryDosDevice(drive, name, MAX_PATH)) { - size_t name_len = _tcslen(name); - if (name_len < MAX_PATH) { - found = _tcsnicmp(filename, name, name_len) == 0 - && *(filename + name_len) == _T('\\'); - if (found) { - // Reconstruct filename using temp_file and replace device path - // with DOS path. - TCHAR temp_file[MAX_PATH]; - _sntprintf(temp_file, - MAX_PATH - 1, - TEXT("%s%s"), - drive, - filename + name_len); - strcpy(filename, temp_file); - } - } - } - - // Go to the next NULL character. - while (*p++) { - // Do nothing. - } - } while (!found && *p); // End of string. - } - } - success = TRUE; - UnmapViewOfFile(mem); - } - - CloseHandle(file_map); - return success; -} -# endif - #endif