diff --git a/include/rapidjson/internal/regex.h b/include/rapidjson/internal/regex.h index 056535e..fcf2600 100644 --- a/include/rapidjson/internal/regex.h +++ b/include/rapidjson/internal/regex.h @@ -463,6 +463,8 @@ private: switch (codepoint) { case ']': + if (start == kRegexInvalidRange) + return false; // Error: nothing inside [] if (step == 2) { // Add trailing '-' SizeType r = NewRange('-'); RAPIDJSON_ASSERT(current != kRegexInvalidRange); diff --git a/test/unittest/regextest.cpp b/test/unittest/regextest.cpp index 37a88ff..65105fa 100644 --- a/test/unittest/regextest.cpp +++ b/test/unittest/regextest.cpp @@ -494,4 +494,40 @@ TEST(Regex, Escape) { EXPECT_FALSE(re.Match(s)); // Not escaping } +TEST(Regex, Invalid) { +#define TEST_INVALID(s) \ + {\ + Regex re(s);\ + EXPECT_FALSE(re.IsValid());\ + } + + TEST_INVALID("a|"); + TEST_INVALID("()"); + TEST_INVALID(")"); + TEST_INVALID("(a))"); + TEST_INVALID("(a|)"); + TEST_INVALID("(a||b)"); + TEST_INVALID("(|b)"); + TEST_INVALID("?"); + TEST_INVALID("*"); + TEST_INVALID("+"); + TEST_INVALID("{"); + TEST_INVALID("{}"); + TEST_INVALID("a{a}"); + TEST_INVALID("a{0}"); + TEST_INVALID("a{-1}"); + TEST_INVALID("a{}"); + TEST_INVALID("a{0,}"); + TEST_INVALID("a{,0}"); + TEST_INVALID("a{1,0}"); + TEST_INVALID("a{-1,0}"); + TEST_INVALID("a{-1,1}"); + TEST_INVALID("[]"); + TEST_INVALID("[^]"); + TEST_INVALID("[\\a]"); + TEST_INVALID("\\a"); + +#undef TEST_INVALID +} + #undef EURO