| Index: runtime/bin/file_win.cc
|
| diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
|
| index bdc4356355a25fcf5dea4a651539b4c24246e646..08417ea9ac03220bc7d83a648c42ef3a9b7f8260 100644
|
| --- a/runtime/bin/file_win.cc
|
| +++ b/runtime/bin/file_win.cc
|
| @@ -471,50 +471,20 @@ bool File::IsAbsolutePath(const char* pathname) {
|
| char* File::GetCanonicalPath(const char* pathname) {
|
| struct _stat st;
|
| const wchar_t* system_name = StringUtils::Utf8ToWide(pathname);
|
| - HANDLE file_handle = CreateFileW(
|
| - system_name,
|
| - 0,
|
| - FILE_SHARE_READ,
|
| - NULL,
|
| - OPEN_EXISTING,
|
| - FILE_FLAG_BACKUP_SEMANTICS,
|
| - NULL);
|
| - if (file_handle == INVALID_HANDLE_VALUE) {
|
| - free(const_cast<wchar_t*>(system_name));
|
| - return NULL;
|
| - }
|
| - wchar_t dummy_buffer[1];
|
| - int required_size = GetFinalPathNameByHandle(file_handle,
|
| - dummy_buffer,
|
| - 0,
|
| - VOLUME_NAME_DOS);
|
| - if (required_size == 0) {
|
| + int stat_status = _wstat(system_name, &st);
|
| + if (stat_status != 0) {
|
| + SetLastError(ERROR_FILE_NOT_FOUND);
|
| free(const_cast<wchar_t*>(system_name));
|
| - DWORD error = GetLastError();
|
| - CloseHandle(file_handle);
|
| - SetLastError(error);
|
| return NULL;
|
| }
|
| + int required_size = GetFullPathNameW(system_name, 0, NULL, NULL);
|
| wchar_t* path =
|
| static_cast<wchar_t*>(malloc(required_size * sizeof(wchar_t)));
|
| - int result_size = GetFinalPathNameByHandle(file_handle,
|
| - path,
|
| - required_size,
|
| - VOLUME_NAME_DOS);
|
| - ASSERT(result_size == required_size - 1);
|
| - // Remove leading \\?\ if possible, unless input used it.
|
| - char* result;
|
| - if (result_size < MAX_PATH - 1 + 4 &&
|
| - result_size > 4 &&
|
| - wcsncmp(path, L"\\\\?\\", 4) == 0 &&
|
| - wcsncmp(system_name, L"\\\\?\\", 4) != 0) {
|
| - result = StringUtils::WideToUtf8(path + 4);
|
| - } else {
|
| - result = StringUtils::WideToUtf8(path);
|
| - }
|
| + int written = GetFullPathNameW(system_name, required_size, path, NULL);
|
| free(const_cast<wchar_t*>(system_name));
|
| + ASSERT(written <= (required_size - 1));
|
| + char* result = StringUtils::WideToUtf8(path);
|
| free(path);
|
| - CloseHandle(file_handle);
|
| return result;
|
| }
|
|
|
|
|