Fix error handling in recursive_directory_iterator::increment
authorJonathan Wakely <jwakely@redhat.com>
Wed, 26 Oct 2016 13:34:34 +0000 (14:34 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 26 Oct 2016 13:34:34 +0000 (14:34 +0100)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/src/filesystem/dir.cc
libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc

index 7d02cf4..fadd349 100644 (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.
 
index 4640d75..bcd7dd0 100644 (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));
     }
index b41c394..79aa178 100644 (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);