libstdc++: Use correct error category for Windows error codes
authorJonathan Wakely <jwakely@redhat.com>
Wed, 10 Feb 2021 16:45:38 +0000 (16:45 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 10 Feb 2021 16:45:38 +0000 (16:45 +0000)
When the result of GetLastError() is stored in a std::error_code it
should use std::system_category(), not std::generic_category() that is
used for POSIX errno values.

libstdc++-v3/ChangeLog:

* src/c++17/fs_ops.cc (fs::create_hard_link, fs::equivalent)
(fs::remove): Use std::system_category() for error codes from
GetLastError().
* src/filesystem/ops.cc (fs::create_hard_link, fs::remove):
Likewise.

libstdc++-v3/src/c++17/fs_ops.cc
libstdc++-v3/src/filesystem/ops.cc

index 04a559ab1d62a94d770b235bb46cd852abbd905a..7deb4c33447d12bc81dc40ca5f3730ed04f05ee5 100644 (file)
@@ -690,7 +690,7 @@ fs::create_hard_link(const path& to, const path& new_hard_link,
   if (CreateHardLinkW(new_hard_link.c_str(), to.c_str(), NULL))
     ec.clear();
   else
-    ec.assign((int)GetLastError(), generic_category());
+    ec.assign((int)GetLastError(), system_category());
 #else
   ec = std::make_error_code(std::errc::not_supported);
 #endif
@@ -882,12 +882,12 @@ fs::equivalent(const path& p1, const path& p2, error_code& ec) noexcept
       if (!h1 || !h2)
        {
          if (!h1 && !h2)
-           ec.assign((int)GetLastError(), generic_category());
+           ec.assign((int)GetLastError(), system_category());
          return false;
        }
       if (!h1.get_info() || !h2.get_info())
        {
-         ec.assign((int)GetLastError(), generic_category());
+         ec.assign((int)GetLastError(), system_category());
          return false;
        }
       return h1.info.dwVolumeSerialNumber == h2.info.dwVolumeSerialNumber
@@ -1263,7 +1263,7 @@ fs::remove(const path& p, error_code& ec) noexcept
          return true;
        }
       else if (!ec)
-       ec.assign((int)GetLastError(), generic_category());
+       ec.assign((int)GetLastError(), system_category());
     }
   else if (status_known(st))
     ec.clear();
index 779d73f13ad7133860a88344ddc654b1cc4badf1..c400376d22464bdea532db7b1acd120766a87a74 100644 (file)
@@ -590,7 +590,7 @@ fs::create_hard_link(const path& to, const path& new_hard_link,
   if (CreateHardLinkW(new_hard_link.c_str(), to.c_str(), NULL))
     ec.clear();
   else
-    ec.assign((int)GetLastError(), generic_category());
+    ec.assign((int)GetLastError(), system_category());
 #else
   ec = std::make_error_code(std::errc::not_supported);
 #endif
@@ -1062,7 +1062,7 @@ fs::remove(const path& p, error_code& ec) noexcept
          return true;
        }
       else if (!ec)
-       ec.assign((int)GetLastError(), generic_category());
+       ec.assign((int)GetLastError(), system_category());
     }
   else if (status_known(st))
     ec.clear();