Fix bug #31387 - not checking end iterator when parsing decimal escape. Thanks to Karen for the report.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@290500 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -4314,7 +4314,8 @@ basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
|
|||||||
else if ('1' <= *__first && *__first <= '9')
|
else if ('1' <= *__first && *__first <= '9')
|
||||||
{
|
{
|
||||||
unsigned __v = *__first - '0';
|
unsigned __v = *__first - '0';
|
||||||
for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
|
for (++__first;
|
||||||
|
__first != __last && '0' <= *__first && *__first <= '9'; ++__first)
|
||||||
__v = 10 * __v + *__first - '0';
|
__v = 10 * __v + *__first - '0';
|
||||||
if (__v > mark_count())
|
if (__v > mark_count())
|
||||||
__throw_regex_error<regex_constants::error_backref>();
|
__throw_regex_error<regex_constants::error_backref>();
|
||||||
|
|||||||
44
test/std/re/re.regex/re.regex.construct/bad_backref.pass.cpp
Normal file
44
test/std/re/re.regex/re.regex.construct/bad_backref.pass.cpp
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||||
|
// Source Licenses. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
// UNSUPPORTED: libcpp-no-exceptions
|
||||||
|
// <regex>
|
||||||
|
|
||||||
|
// template <class charT, class traits = regex_traits<charT>> class basic_regex;
|
||||||
|
|
||||||
|
// template <class ST, class SA>
|
||||||
|
// basic_regex(const basic_string<charT, ST, SA>& s);
|
||||||
|
|
||||||
|
#include <regex>
|
||||||
|
#include <cassert>
|
||||||
|
#include "test_macros.h"
|
||||||
|
|
||||||
|
static bool error_badbackref_thrown(const char *pat)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
try {
|
||||||
|
std::regex re(pat);
|
||||||
|
} catch (const std::regex_error &ex) {
|
||||||
|
result = (ex.code() == std::regex_constants::error_backref);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
assert(error_badbackref_thrown("\\1abc")); // no references
|
||||||
|
assert(error_badbackref_thrown("ab(c)\\2def")); // only one reference
|
||||||
|
|
||||||
|
// this should NOT throw, because we only should look at the '1'
|
||||||
|
// See https://llvm.org/bugs/show_bug.cgi?id=31387
|
||||||
|
{
|
||||||
|
const char *pat1 = "a(b)c\\1234";
|
||||||
|
std::regex re(pat1, pat1 + 7); // extra chars after the end.
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user