diff --git a/include/boost/regex/v4/basic_regex_parser.hpp b/include/boost/regex/v4/basic_regex_parser.hpp index fcf512c2..b2d99f09 100644 --- a/include/boost/regex/v4/basic_regex_parser.hpp +++ b/include/boost/regex/v4/basic_regex_parser.hpp @@ -784,6 +784,7 @@ bool basic_regex_parser::parse_repeat(std::size_t low, std::size_ case syntax_element_restart_continue: case syntax_element_jump: case syntax_element_startmark: + case syntax_element_backstep: // can't legally repeat any of the above: fail(regex_constants::error_badrepeat, m_position - m_base); return false; @@ -1869,6 +1870,7 @@ bool basic_regex_parser::parse_perl_extension() if(markid == -4) { re_syntax_base* b = this->getaddress(expected_alt_point); + // Make sure we have exactly one alternative following this state: if(b->type != syntax_element_alt) { re_alt* alt = static_cast(this->insert_state(expected_alt_point, syntax_element_alt, sizeof(re_alt))); @@ -1879,6 +1881,15 @@ bool basic_regex_parser::parse_perl_extension() fail(regex_constants::error_bad_pattern, m_position - m_base); return false; } + // check for invalid repetition of next state: + b = this->getaddress(expected_alt_point); + b = this->getaddress(static_cast(b)->next.i, b); + if((b->type != syntax_element_assert_backref) + && (b->type != syntax_element_startmark)) + { + fail(regex_constants::error_badrepeat, m_position - m_base); + return false; + } } // // append closing parenthesis state: diff --git a/test/regress/test_perl_ex.cpp b/test/regress/test_perl_ex.cpp index 82a0517f..3bf104b7 100644 --- a/test/regress/test_perl_ex.cpp +++ b/test/regress/test_perl_ex.cpp @@ -121,6 +121,17 @@ void test_conditionals() TEST_INVALID_REGEX("(?:(a)|b)(?(?:", perl); TEST_INVALID_REGEX("(?:(a)|b)(?(?<", perl); TEST_INVALID_REGEX("(?:(a)|b)(?(?