summaryrefslogtreecommitdiff
path: root/libstdc++-v3/src/c++17/fs_dir.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/src/c++17/fs_dir.cc')
-rw-r--r--libstdc++-v3/src/c++17/fs_dir.cc12
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));