[PATCH] Fix std::filesystem::absolute for empty paths

Jonathan Wakely jwakely@redhat.com
Mon May 21 12:52:00 GMT 2018


	* 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.

Tested powerpcle-linux, committed to trunk.

-------------- next part --------------
commit 0fd34cfc51004390afc7195732f9dbf3dd363420
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Mon May 21 13:38:40 2018 +0100

    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.

diff --git a/libstdc++-v3/src/filesystem/std-ops.cc b/libstdc++-v3/src/filesystem/std-ops.cc
index 74868cd48e6..00e4f987fc3 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 4e472edd375..413a86758f0 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


More information about the Libstdc++ mailing list