Index: b/regparse.c
===================================================================
--- a/regparse.c (revision 57908)
+++ b/regparse.c (revision 57909)
@@ -4570,11 +4570,11 @@ parse_char_class(Node** np, Node** asc_n https://github.com/ruby/ruby/blob/trunk/ruby_2_4/regparse.c#L4570
enum CCVALTYPE val_type, in_type;
int val_israw, in_israw;
+ *np = *asc_np = NULL_NODE;
env->parse_depth++;
if (env->parse_depth > ParseDepthLimit)
return ONIGERR_PARSE_DEPTH_LIMIT_OVER;
prev_cc = asc_prev_cc = (CClassNode* )NULL;
- *np = *asc_np = NULL_NODE;
r = fetch_token_in_cc(tok, src, end, env);
if (r == TK_CHAR && tok->u.c == '^' && tok->escaped == 0) {
neg = 1;
Index: b/ext/-test-/regexp/init.c
===================================================================
--- a/ext/-test-/regexp/init.c (revision 0)
+++ b/ext/-test-/regexp/init.c (revision 57909)
@@ -0,0 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_4/ext/-test-/regexp/init.c#L1
+#include "ruby.h"
+
+#define init(n) {void Init_##n(VALUE klass); Init_##n(klass);}
+
+void
+Init_regexp(void)
+{
+ VALUE mBug = rb_define_module("Bug");
+ VALUE klass = rb_define_class_under(mBug, "Regexp", rb_cRegexp);
+ TEST_INIT_FUNCS(init);
+}
Property changes on: ruby_2_4/ext/-test-/regexp/init.c
___________________________________________________________________
Added: svn:eol-style
+ LF
Index: b/ext/-test-/regexp/extconf.rb
===================================================================
--- a/ext/-test-/regexp/extconf.rb (revision 0)
+++ b/ext/-test-/regexp/extconf.rb (revision 57909)
@@ -0,0 +1,3 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_4/ext/-test-/regexp/extconf.rb#L1
+# frozen_string_literal: false
+require_relative "../auto_ext.rb"
+auto_ext
Property changes on: ruby_2_4/ext/-test-/regexp/extconf.rb
___________________________________________________________________
Added: svn:eol-style
+ LF
Index: b/ext/-test-/regexp/parse_depth_limit.c
===================================================================
--- a/ext/-test-/regexp/parse_depth_limit.c (revision 0)
+++ b/ext/-test-/regexp/parse_depth_limit.c (revision 57909)
@@ -0,0 +1,23 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_4/ext/-test-/regexp/parse_depth_limit.c#L1
+#include <ruby.h>
+#include <ruby/onigmo.h>
+
+static VALUE
+get_parse_depth_limit(VALUE self)
+{
+ unsigned int depth = onig_get_parse_depth_limit();
+ return UINT2NUM(depth);
+}
+
+static VALUE
+set_parse_depth_limit(VALUE self, VALUE depth)
+{
+ onig_set_parse_depth_limit(NUM2UINT(depth));
+ return depth;
+}
+
+void
+Init_parse_depth_limit(VALUE klass)
+{
+ rb_define_singleton_method(klass, "parse_depth_limit", get_parse_depth_limit, 0);
+ rb_define_singleton_method(klass, "parse_depth_limit=", set_parse_depth_limit, 1);
+}
Property changes on: ruby_2_4/ext/-test-/regexp/parse_depth_limit.c
___________________________________________________________________
Added: svn:eol-style
+ LF
Index: b/test/ruby/test_regexp.rb
===================================================================
--- a/test/ruby/test_regexp.rb (revision 57908)
+++ b/test/ruby/test_regexp.rb (revision 57909)
@@ -1198,6 +1198,25 @@ class TestRegexp < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_4/test/ruby/test_regexp.rb#L1198
RUBY
end
+ def test_invalid_free_at_parse_depth_limit_over
+ assert_separately([], "#{<<-"begin;"}\n#{<<-"end;"}")
+ begin;
+ begin
+ require '-test-/regexp'
+ rescue LoadError
+ else
+ bug = '[ruby-core:79624] [Bug #13234]'
+ Bug::Regexp.parse_depth_limit = 10
+ src = "[" * 100
+ 3.times do
+ assert_raise_with_message(RegexpError, /parse depth limit over/, bug) do
+ Regexp.new(src)
+ end
+ end
+ end
+ end;
+ end
+
# This assertion is for porting x2() tests in testpy.py of Onigmo.
def assert_match_at(re, str, positions, msg = nil)
re = Regexp.new(re) unless re.is_a?(Regexp)