65 lines
1.7 KiB
Diff
65 lines
1.7 KiB
Diff
|
|
From 052ec6d2585c3ace95671013d336f5543624ef3d Mon Sep 17 00:00:00 2001
|
||
|
|
From: nagachika <nagachika@ruby-lang.org>
|
||
|
|
Date: Tue, 12 Apr 2022 20:07:08 +0900
|
||
|
|
Subject: [PATCH] Just free compiled pattern if no space is used
|
||
|
|
|
||
|
|
---
|
||
|
|
regcomp.c | 14 ++++++++------
|
||
|
|
test/ruby/test_regexp.rb | 9 +++++++++
|
||
|
|
2 files changed, 17 insertions(+), 6 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/regcomp.c b/regcomp.c
|
||
|
|
index 3a438b94c4a5..bd383138753d 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 35d20eeda656..679a013cf041 100644
|
||
|
|
--- a/test/ruby/test_regexp.rb
|
||
|
|
+++ b/test/ruby/test_regexp.rb
|
||
|
|
@@ -1344,6 +1344,15 @@ def test_backref_overrun
|
||
|
|
end
|
||
|
|
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)
|
||
|
|
--
|
||
|
|
1.8.3.1
|