Commit fc6f857b by Jonathan Wakely Committed by Jonathan Wakely

PR libstdc++/88884 fix filesystem::absolute("//") for mingw

	PR libstdc++/88884
	* src/c++17/fs_ops.cc (absolute(const path&, error_code&)): Do nothing
	if the path is already absolute.
	[_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Normalize root-directory.
	[!_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Pass error_code to current_path.

From-SVN: r268035
parent dd0f7ba2
2019-01-17 Jonathan Wakely <jwakely@redhat.com> 2019-01-17 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/88884
* src/c++17/fs_ops.cc (absolute(const path&, error_code&)): Do nothing
if the path is already absolute.
[_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Normalize root-directory.
[!_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Pass error_code to current_path.
PR libstdc++/88881 PR libstdc++/88881
* src/c++17/fs_ops.cc (canonical(const path&, error_code&)) * src/c++17/fs_ops.cc (canonical(const path&, error_code&))
[_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Normalize path, to match behaviour [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Normalize path, to match behaviour
......
...@@ -85,14 +85,35 @@ fs::absolute(const path& p, error_code& ec) ...@@ -85,14 +85,35 @@ fs::absolute(const path& p, error_code& ec)
ec = make_error_code(std::errc::no_such_file_or_directory); ec = make_error_code(std::errc::no_such_file_or_directory);
return ret; return ret;
} }
ec.clear();
if (p.is_absolute())
{
ret = p;
return ret;
}
#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
const wstring& s = p.native(); wstring_view s = p.native();
if (p.has_root_directory()) // implies !p.has_root_name()
{
// GetFullPathNameW("//") gives unwanted result (PR 88884).
// If there are multiple directory separators at the start,
// skip all but the last of them.
const auto pos = s.find_first_not_of(L"/\\");
__glibcxx_assert(pos != 0);
s.remove_prefix(std::min(s.length(), pos) - 1);
}
// s must be null-terminated
__glibcxx_assert(!s.empty() && s.back() == 0);
uint32_t len = 1024; uint32_t len = 1024;
wstring buf; wstring buf;
do do
{ {
buf.resize(len); buf.resize(len);
len = GetFullPathNameW(s.c_str(), len, buf.data(), nullptr); len = GetFullPathNameW(s.data(), len, buf.data(), nullptr);
} }
while (len > buf.size()); while (len > buf.size());
...@@ -100,13 +121,11 @@ fs::absolute(const path& p, error_code& ec) ...@@ -100,13 +121,11 @@ fs::absolute(const path& p, error_code& ec)
ec.assign((int)GetLastError(), std::system_category()); ec.assign((int)GetLastError(), std::system_category());
else else
{ {
ec.clear();
buf.resize(len); buf.resize(len);
ret = std::move(buf); ret = std::move(buf);
} }
#else #else
ec.clear(); ret = current_path(ec);
ret = current_path();
ret /= p; ret /= p;
#endif #endif
return ret; return ret;
......
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