aboutsummaryrefslogtreecommitdiffstats
path: root/test/ruby/test_regexp.rb
diff options
context:
space:
mode:
authorTSUYUSATO Kitsune <make.just.on@gmail.com>2022-11-07 09:03:12 +0900
committerYusuke Endoh <mame@ruby-lang.org>2022-11-09 23:21:26 +0900
commit80d145fa52e9077dc7812a94f3fc41208fc58bd7 (patch)
tree35e3bff0e171751254cbeecc0c1b11155d7be99d /test/ruby/test_regexp.rb
parentff2998a86c5f4238462715eaf6b6bfd70519349b (diff)
downloadruby-80d145fa52e9077dc7812a94f3fc41208fc58bd7.tar.gz
Fix and add regexp tests
Diffstat (limited to 'test/ruby/test_regexp.rb')
-rw-r--r--test/ruby/test_regexp.rb24
1 files changed, 22 insertions, 2 deletions
diff --git a/test/ruby/test_regexp.rb b/test/ruby/test_regexp.rb
index 3d3cdbb46e..5daf67a436 100644
--- a/test/ruby/test_regexp.rb
+++ b/test/ruby/test_regexp.rb
@@ -1589,7 +1589,7 @@ class TestRegexp < Test::Unit::TestCase
t = Time.now
assert_raise_with_message(Regexp::TimeoutError, "regexp match timeout") do
# A typical ReDoS case
- /^(a*)*$/ =~ "a" * 1000000 + "x"
+ /^(a*)*\1$/ =~ "a" * 1000000 + "x"
end
t = Time.now - t
@@ -1631,7 +1631,7 @@ class TestRegexp < Test::Unit::TestCase
Regexp.timeout = global_timeout
- re = Regexp.new("^a*b?a*$", timeout: per_instance_timeout)
+ re = Regexp.new("^(a*)\\1b?a*$", timeout: per_instance_timeout)
assert_equal(per_instance_timeout, re.timeout)
t = Time.now
@@ -1673,4 +1673,24 @@ class TestRegexp < Test::Unit::TestCase
assert_raise(ArgumentError) { Regexp.new("foo", timeout: -1) }
end;
end
+
+ def test_cache_optimization_exponential
+ assert_separately([], "#{<<-"begin;"}\n#{<<-'end;'}")
+ begin;
+ timeout = EnvUtil.apply_timeout_scale(0.2)
+ Regexp.timeout = timeout
+
+ assert_nil(/^(a*)*$/ =~ "a" * 1000000 + "x")
+ end;
+ end
+
+ def test_cache_optimization_square
+ assert_separately([], "#{<<-"begin;"}\n#{<<-'end;'}")
+ begin;
+ timeout = EnvUtil.apply_timeout_scale(0.2)
+ Regexp.timeout = timeout
+
+ assert_nil(/^a*b?a*$/ =~ "a" * 1000000 + "x")
+ end;
+ end
end