diff options
Diffstat (limited to 'libstdc++-v3/src/c++17/fs_dir.cc')
-rw-r--r-- | libstdc++-v3/src/c++17/fs_dir.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/libstdc++-v3/src/c++17/fs_dir.cc b/libstdc++-v3/src/c++17/fs_dir.cc index e050304c19a..149a8b0740c 100644 --- a/libstdc++-v3/src/c++17/fs_dir.cc +++ b/libstdc++-v3/src/c++17/fs_dir.cc @@ -311,6 +311,10 @@ fs::recursive_directory_iterator::increment(error_code& ec) return *this; } } + + if (ec) + _M_dirs.reset(); + return *this; } @@ -334,16 +338,20 @@ fs::recursive_directory_iterator::pop(error_code& ec) ec.clear(); return; } - } while (!_M_dirs->top().advance(skip_permission_denied, ec)); + } while (!_M_dirs->top().advance(skip_permission_denied, ec) && !ec); + + if (ec) + _M_dirs.reset(); } void fs::recursive_directory_iterator::pop() { + const bool dereferenceable = _M_dirs != nullptr; error_code ec; pop(ec); if (ec) - _GLIBCXX_THROW_OR_ABORT(filesystem_error(_M_dirs + _GLIBCXX_THROW_OR_ABORT(filesystem_error(dereferenceable ? "recursive directory iterator cannot pop" : "non-dereferenceable recursive directory iterator cannot pop", ec)); |