Skip to content

Commit

Permalink
Merge pull request #163 from boostorg/issue151
Browse files Browse the repository at this point in the history
Disallow repeating a case-change group.
  • Loading branch information
jzmaddock authored Oct 14, 2021
2 parents 2be85f3 + b10c089 commit 75600e3
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
9 changes: 8 additions & 1 deletion include/boost/regex/v5/basic_regex_parser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1034,6 +1034,7 @@ bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_
case syntax_element_jump:
case syntax_element_startmark:
case syntax_element_backstep:
case syntax_element_toggle_case:
// can't legally repeat any of the above:
fail(regex_constants::error_badrepeat, m_position - m_base);
return false;
Expand Down Expand Up @@ -3107,7 +3108,13 @@ bool basic_regex_parser<charT, traits>::unwind_alts(std::ptrdiff_t last_paren_st
m_alt_jumps.pop_back();
this->m_pdata->m_data.align();
re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset));
BOOST_REGEX_ASSERT(jmp->type == syntax_element_jump);
if (jmp->type != syntax_element_jump)
{
// Something really bad happened, this used to be an assert,
// but we'll make it an error just in case we should ever get here.
fail(regex_constants::error_unknown, this->m_position - this->m_base, "Internal logic failed while compiling the expression, probably you added a repeat to something non-repeatable!");
return false;
}
jmp->alt.i = this->m_pdata->m_data.size() - jump_offset;
}
return true;
Expand Down
8 changes: 8 additions & 0 deletions test/regress/test_simple_repeats.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -496,5 +496,13 @@ void test_pocessive_repeats()
TEST_INVALID_REGEX("(ab + + +)", perl | mod_x);
TEST_INVALID_REGEX("(ab + + ?)", perl | mod_x);

#ifndef BOOST_REGEX_CXX03
// Some bug cases from https://github.com/boostorg/regex/issues/151
TEST_INVALID_REGEX("a|?+", perl | mod_x);
TEST_INVALID_REGEX("(?xi)a|?+", perl | mod_x);
TEST_INVALID_REGEX("(?xi)a|#\r*", perl | mod_x);
TEST_INVALID_REGEX("(?xi)|#\r*", perl | mod_x);
TEST_INVALID_REGEX("(?xi)|?+#\r*", perl | mod_x);
#endif
}

0 comments on commit 75600e3

Please sign in to comment.