diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-03-11 16:43:51 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-03-11 17:52:56 +0000 |
commit | 8cfb387388a90730ab36ac24d9049677db633a11 (patch) | |
tree | cc217cc04ae8b09ef734c7d4d945bb4241f395a8 | |
parent | 67e397660611990efd98f9e4106c1ee81f6803a4 (diff) | |
download | gcc-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.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/src/filesystem/dir-common.h | 12 | ||||
-rw-r--r-- | libstdc++-v3/src/filesystem/dir.cc | 2 |
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) |