diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-05-21 13:52:44 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2018-05-21 13:52:44 +0100 |
commit | 8a49324e8a22e47e38656d0a7e2073af186204d6 (patch) | |
tree | 5068c314d6c6bfe307c4e16a72b4cbdbd9b4f026 | |
parent | cc343938cbb65881f9a6e3bc019aeff6c5a38137 (diff) | |
download | gcc-8a49324e8a22e47e38656d0a7e2073af186204d6.zip gcc-8a49324e8a22e47e38656d0a7e2073af186204d6.tar.gz gcc-8a49324e8a22e47e38656d0a7e2073af186204d6.tar.bz2 |
Fix std::filesystem::absolute for empty paths
* src/filesystem/std-ops.cc (absolute): Report an error for empty
paths.
(weakly_canonical(const path&)): Do not call canonical on empty path.
(weakly_canonical(const path&, error_code&)): Likewise.
* testsuite/27_io/filesystem/operations/absolute.cc: Check for errors.
From-SVN: r260441
-rw-r--r-- | libstdc++-v3/ChangeLog | 6 | ||||
-rw-r--r-- | libstdc++-v3/src/filesystem/std-ops.cc | 16 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc | 6 |
3 files changed, 23 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1513561..78f5df6 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,11 @@ 2018-05-21 Jonathan Wakely <jwakely@redhat.com> + * src/filesystem/std-ops.cc (absolute): Report an error for empty + paths. + (weakly_canonical(const path&)): Do not call canonical on empty path. + (weakly_canonical(const path&, error_code&)): Likewise. + * testsuite/27_io/filesystem/operations/absolute.cc: Check for errors. + PR libstdc++/85818 * testsuite/experimental/filesystem/path/preferred_separator.cc: Add dg-require-filesystem-ts. diff --git a/libstdc++-v3/src/filesystem/std-ops.cc b/libstdc++-v3/src/filesystem/std-ops.cc index 74868cd..00e4f98 100644 --- a/libstdc++-v3/src/filesystem/std-ops.cc +++ b/libstdc++-v3/src/filesystem/std-ops.cc @@ -84,13 +84,20 @@ fs::absolute(const path& p) fs::path fs::absolute(const path& p, error_code& ec) { + path ret; + if (p.empty()) + { + ec = make_error_code(std::errc::no_such_file_or_directory); + return ret; + } #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS ec = std::make_error_code(errc::not_supported); - return {}; #else ec.clear(); - return current_path() / p; + ret = current_path(); + ret /= p; #endif + return ret; } namespace @@ -1513,7 +1520,8 @@ fs::weakly_canonical(const path& p) ++iter; } // canonicalize: - result = canonical(result); + if (!result.empty()) + result = canonical(result); // append the non-existing elements: while (iter != end) result /= *iter++; @@ -1551,7 +1559,7 @@ fs::weakly_canonical(const path& p, error_code& ec) ++iter; } // canonicalize: - if (!ec) + if (!ec && !result.empty()) result = canonical(result, ec); if (ec) result.clear(); diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc index 4e472ed..413a867 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc @@ -31,7 +31,11 @@ void test01() { for (const path& p : __gnu_test::test_paths) - VERIFY( absolute(p).is_absolute() ); + { + std::error_code ec; + path abs = absolute(p, ec); + VERIFY( ec || abs.is_absolute() ); + } } void |