[前][次][番号順一覧][スレッド一覧]

ruby-changes:45587

From: nobu <ko1@a...>
Date: Mon, 20 Feb 2017 18:46:18 +0900 (JST)
Subject: [ruby-changes:45587] nobu:r57660 (trunk): regparse.c: initialize return values

nobu	2017-02-20 18:46:12 +0900 (Mon, 20 Feb 2017)

  New Revision: 57660

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=57660

  Log:
    regparse.c: initialize return values
    
    * regparse.c (parse_char_class): initialize return values before
      depth limit check.  returned values will be freed in callers
      regardless the error.  [ruby-core:79624] [Bug #13234]

  Added directories:
    trunk/ext/-test-/regexp/
  Added files:
    trunk/ext/-test-/regexp/extconf.rb
    trunk/ext/-test-/regexp/init.c
    trunk/ext/-test-/regexp/parse_depth_limit.c
  Modified files:
    trunk/regparse.c
    trunk/test/ruby/test_regexp.rb
Index: regparse.c
===================================================================
--- regparse.c	(revision 57659)
+++ regparse.c	(revision 57660)
@@ -4572,11 +4572,11 @@ parse_char_class(Node** np, Node** asc_n https://github.com/ruby/ruby/blob/trunk/regparse.c#L4572
   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: ext/-test-/regexp/parse_depth_limit.c
===================================================================
--- ext/-test-/regexp/parse_depth_limit.c	(revision 0)
+++ ext/-test-/regexp/parse_depth_limit.c	(revision 57660)
@@ -0,0 +1,23 @@ https://github.com/ruby/ruby/blob/trunk/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: ext/-test-/regexp/parse_depth_limit.c
___________________________________________________________________
Added: svn:eol-style
   + LF

Index: ext/-test-/regexp/init.c
===================================================================
--- ext/-test-/regexp/init.c	(revision 0)
+++ ext/-test-/regexp/init.c	(revision 57660)
@@ -0,0 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/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: ext/-test-/regexp/init.c
___________________________________________________________________
Added: svn:eol-style
   + LF

Index: ext/-test-/regexp/extconf.rb
===================================================================
--- ext/-test-/regexp/extconf.rb	(revision 0)
+++ ext/-test-/regexp/extconf.rb	(revision 57660)
@@ -0,0 +1,3 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/regexp/extconf.rb#L1
+# frozen_string_literal: false
+require_relative "../auto_ext.rb"
+auto_ext

Property changes on: ext/-test-/regexp/extconf.rb
___________________________________________________________________
Added: svn:eol-style
   + LF

Index: test/ruby/test_regexp.rb
===================================================================
--- test/ruby/test_regexp.rb	(revision 57659)
+++ test/ruby/test_regexp.rb	(revision 57660)
@@ -1198,6 +1198,25 @@ class TestRegexp < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/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)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]