Fix std::filesystem::absolute for empty paths
authorJonathan Wakely <jwakely@redhat.com>
Mon, 21 May 2018 12:52:44 +0000 (13:52 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 21 May 2018 12:52:44 +0000 (13:52 +0100)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/src/filesystem/std-ops.cc
libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc

index 1513561bbd44c1fb443081ff8f6f3e3fe0240b26..78f5df691d8ebf2d1eefd895281d6ba7ac9c2889 100644 (file)
@@ -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.
index 74868cd48e6dddb41185814c5b53f3867ce4095c..00e4f987fc3a7c659671fa650dd3c43a3476725a 100644 (file)
@@ -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();
index 4e472edd37541c2edbc354d93bb72f6726fbc9f7..413a86758f083eada786a9462bb53b333bcc681c 100644 (file)
@@ -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