Fix error handling in recursive_directory_iterator::increment

* src/filesystem/dir.cc (recursive_directory_iterator::increment):
	Reset state on error.
	* testsuite/experimental/filesystem/iterators/
	recursive_directory_iterator.cc: Check state after increment error.

From-SVN: r241552
This commit is contained in:
Jonathan Wakely 2016-10-26 14:34:34 +01:00 committed by Jonathan Wakely
parent 09844a5f64
commit b4e7e6bf22
3 changed files with 10 additions and 1 deletions

View File

@ -1,5 +1,10 @@
2016-10-26 Jonathan Wakely <jwakely@redhat.com>
* src/filesystem/dir.cc (recursive_directory_iterator::increment):
Reset state on error.
* testsuite/experimental/filesystem/iterators/
recursive_directory_iterator.cc: Check state after increment error.
PR libstdc++/78111
* src/filesystem/ops.cc (canonical): Set error for non-existent path.

View File

@ -343,7 +343,10 @@ fs::recursive_directory_iterator::increment(error_code& ec) noexcept
{
_Dir dir = open_dir(top.entry.path(), _M_options, &ec);
if (ec)
return *this;
{
_M_dirs.reset();
return *this;
}
if (dir.dirp)
_M_dirs->push(std::move(dir));
}

View File

@ -81,6 +81,7 @@ test01()
VERIFY( iter->path() == p/"d1/d2" );
iter.increment(ec); // should fail to recurse into p/d1/d2
VERIFY( ec );
VERIFY( iter == fs::recursive_directory_iterator() );
// Test inaccessible sub-directory, skipping permission denied.
iter = fs::recursive_directory_iterator(p, opts, ec);