|
@@ -773,6 +773,8 @@ _LIBCPP_PUSH_MACROS
|
|
|
#include <__undef_macros>
|
|
|
|
|
|
|
|
|
+#define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096
|
|
|
+
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
|
|
namespace regex_constants
|
|
@@ -5552,8 +5554,14 @@ basic_regex<_CharT, _Traits>::__match_at_start_ecma(
|
|
|
__states.back().__node_ = __st;
|
|
|
__states.back().__flags_ = __flags;
|
|
|
__states.back().__at_first_ = __at_first;
|
|
|
+ int __counter = 0;
|
|
|
+ int __length = __last - __first;
|
|
|
do
|
|
|
{
|
|
|
+ ++__counter;
|
|
|
+ if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
|
|
|
+ __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
|
|
|
+ __throw_regex_error<regex_constants::error_complexity>();
|
|
|
__state& __s = __states.back();
|
|
|
if (__s.__node_)
|
|
|
__s.__node_->__exec(__s);
|
|
@@ -5627,8 +5635,14 @@ basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
|
|
|
__states.back().__flags_ = __flags;
|
|
|
__states.back().__at_first_ = __at_first;
|
|
|
bool __matched = false;
|
|
|
+ int __counter = 0;
|
|
|
+ int __length = __last - __first;
|
|
|
do
|
|
|
{
|
|
|
+ ++__counter;
|
|
|
+ if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
|
|
|
+ __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
|
|
|
+ __throw_regex_error<regex_constants::error_complexity>();
|
|
|
__state& __s = __states.back();
|
|
|
if (__s.__node_)
|
|
|
__s.__node_->__exec(__s);
|
|
@@ -5724,8 +5738,14 @@ basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
|
|
|
__states.back().__at_first_ = __at_first;
|
|
|
const _CharT* __current = __first;
|
|
|
bool __matched = false;
|
|
|
+ int __counter = 0;
|
|
|
+ int __length = __last - __first;
|
|
|
do
|
|
|
{
|
|
|
+ ++__counter;
|
|
|
+ if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
|
|
|
+ __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
|
|
|
+ __throw_regex_error<regex_constants::error_complexity>();
|
|
|
__state& __s = __states.back();
|
|
|
if (__s.__node_)
|
|
|
__s.__node_->__exec(__s);
|