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/