]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Handle EPERM for filesystem access errors on MacOS [PR 99537]
authorJonathan Wakely <jwakely@redhat.com>
Thu, 11 Mar 2021 16:43:51 +0000 (16:43 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 11 Mar 2021 17:52:56 +0000 (17:52 +0000)
Contrary to what POSIX says, some directory operations on MacOS can fail
with EPERM instead of EACCES, so we need to handle both.

libstdc++-v3/ChangeLog:

PR libstdc++/99537
* src/c++17/fs_dir.cc (recursive_directory_iterator): Use new
helper function to check for permission denied errors.
* src/filesystem/dir.cc (recursive_directory_iterator):
Likewise.
* src/filesystem/dir-common.h (is_permission_denied_error): New
helper function.

libstdc++-v3/src/c++17/fs_dir.cc
libstdc++-v3/src/filesystem/dir-common.h
libstdc++-v3/src/filesystem/dir.cc

index 994368c25c481689f110d1b44fcc8119d4ae0f0e..4de0f798d052f21f55eb59e8f7e21e343c0d2480 100644 (file)
@@ -207,7 +207,7 @@ recursive_directory_iterator(const path& p, directory_options options,
   else
     {
       const int err = errno;
-      if (err == EACCES
+      if (fs::is_permission_denied_error(err)
          && is_set(options, fs::directory_options::skip_permission_denied))
        {
          if (ecptr)
index 56e279230f446d85d087687c4e4f3ed05d00961d..a49b8304a29d149f561bb7d088bbff03513ac878 100644 (file)
@@ -141,6 +141,18 @@ struct _Dir_base
   posix::DIR*  dirp;
 };
 
+inline bool
+is_permission_denied_error(int e)
+{
+  if (e == EACCES)
+    return true;
+#ifdef __APPLE__
+  if (e == EPERM) // See PR 99533
+    return true;
+#endif
+  return false;
+}
+
 } // namespace filesystem
 
 // BEGIN/END macros must be defined before including this file.
index acc62986c68e5cb732d0632f86aeed5892ff0d82..215a9533f1b6b9ea8e2faca59d6ff260926d54b2 100644 (file)
@@ -202,7 +202,7 @@ recursive_directory_iterator(const path& p, directory_options options,
   else
     {
       const int err = errno;
-      if (err == EACCES
+      if (std::filesystem::is_permission_denied_error(err)
          && is_set(options, fs::directory_options::skip_permission_denied))
        {
          if (ecptr)