diff --git a/regcomp.c b/regcomp.c index 3e65c9d2e3..94640639d8 100644 --- a/regcomp.c +++ b/regcomp.c @@ -142,8 +142,13 @@ bitset_on_num(BitSetRef bs) static void onig_reg_resize(regex_t *reg) { - resize: - if (reg->alloc > reg->used) { + do { + if (!reg->used) { + xfree(reg->p); + reg->alloc = 0; + reg->p = 0; + } + else if (reg->alloc > reg->used) { unsigned char *new_ptr = xrealloc(reg->p, reg->used); // Skip the right size optimization if memory allocation fails if (new_ptr) { @@ -151,10 +156,7 @@ onig_reg_resize(regex_t *reg) reg->p = new_ptr; } } - if (reg->chain) { - reg = reg->chain; - goto resize; - } + } while ((reg = reg->chain) != 0); } extern int diff --git a/test/ruby/test_regexp.rb b/test/ruby/test_regexp.rb index 4be6d7bec7..84687c5380 100644 --- a/test/ruby/test_regexp.rb +++ b/test/ruby/test_regexp.rb @@ -1431,6 +1431,15 @@ class TestRegexp < Test::Unit::TestCase assert_kind_of MatchData, /(?a)(?aa)\k/.match("aaaab") end + def test_invalid_group + assert_separately([], "#{<<-"begin;"}\n#{<<-'end;'}") + begin; + assert_raise_with_message(RegexpError, /invalid conditional pattern/) do + Regexp.new("((?(1)x|x|)x)+") + 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)