aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2021-03-11 16:43:51 +0000
committerJonathan Wakely <jwakely@redhat.com>2021-03-11 17:52:56 +0000
commit8cfb387388a90730ab36ac24d9049677db633a11 (patch)
treecc217cc04ae8b09ef734c7d4d945bb4241f395a8
parent67e397660611990efd98f9e4106c1ee81f6803a4 (diff)
downloadgcc-8cfb387388a90730ab36ac24d9049677db633a11.zip
gcc-8cfb387388a90730ab36ac24d9049677db633a11.tar.gz
gcc-8cfb387388a90730ab36ac24d9049677db633a11.tar.bz2
libstdc++: Handle EPERM for filesystem access errors on MacOS [PR 99537]
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.
-rw-r--r--libstdc++-v3/src/c++17/fs_dir.cc2
-rw-r--r--libstdc++-v3/src/filesystem/dir-common.h12
-rw-r--r--libstdc++-v3/src/filesystem/dir.cc2
3 files changed, 14 insertions, 2 deletions
diff --git a/libstdc++-v3/src/c++17/fs_dir.cc b/libstdc++-v3/src/c++17/fs_dir.cc
index 994368c..4de0f79 100644
--- a/libstdc++-v3/src/c++17/fs_dir.cc
+++ b/libstdc++-v3/src/c++17/fs_dir.cc
@@ -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)
diff --git a/libstdc++-v3/src/filesystem/dir-common.h b/libstdc++-v3/src/filesystem/dir-common.h
index 56e2792..a49b830 100644
--- a/libstdc++-v3/src/filesystem/dir-common.h
+++ b/libstdc++-v3/src/filesystem/dir-common.h
@@ -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.
diff --git a/libstdc++-v3/src/filesystem/dir.cc b/libstdc++-v3/src/filesystem/dir.cc
index acc6298..215a953 100644
--- a/libstdc++-v3/src/filesystem/dir.cc
+++ b/libstdc++-v3/src/filesystem/dir.cc
@@ -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)