Opened 7 years ago
Last modified 7 years ago
#11910 new Bugs
recursive_directory_iterator doesn't set end iterator properly when exception is thrown in increment()
| Reported by: | Owned by: | Beman Dawes | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | filesystem |
| Version: | Boost 1.60.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
in operations.hpp the increment function looks like this:
void increment()
{
BOOST_ASSERT_MSG(m_imp.get(),
"increment of end recursive_directory_iterator");
m_imp->increment(0);
if (m_imp->m_stack.empty())
m_imp.reset(); // done, so make end iterator
}
The problem occurs when you are incrementing using the ++ operator. If there is an exception, the stack is never checked to see if it is empty because the m_imp->increment() throws an exception. This leaves the recursive iterator in a bad state.
I fixed it by doing this:
void increment()
{
BOOST_ASSERT_MSG(m_imp.get(),
"increment of end recursive_directory_iterator");
try
{
m_imp->increment(0);
}
catch(filesystem_error e)
{
if (m_imp->m_stack.empty())
m_imp.reset(); // done, so make end iterator
throw(e);
}
if (m_imp->m_stack.empty())
m_imp.reset(); // done, so make end iterator
}
but I'm not sure that is the right way to address this issue.
Change History (1)
comment:1 by , 7 years ago
| Summary: | recursive_directory_iterator doesn't set end_iterator properly when exception is thrown in increment() → recursive_directory_iterator doesn't set end iterator properly when exception is thrown in increment() |
|---|
Note:
See TracTickets
for help on using tickets.
