summaryrefslogtreecommitdiff
path: root/re.c
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2024-01-30 14:16:51 -0500
committerPeter Zhu <[email protected]>2024-02-02 10:39:42 -0500
commit01bfd1a2bf013a9ed92a9722ac5228187e05e6a8 ()
tree559ec5dfa2e57eb51e4be32442e1bf0afa30f2e5 /re.c
parent1c120efe02d079b0a1dea573cf0fd7978d9cc857 (diff)
Fix memory in OnigRegion when match raises
[Bug #20228] rb_reg_onig_match can raise a Regexp::TimeoutError, which would cause the OnigRegion to .
-rw-r--r--re.c55
1 files changed, 44 insertions, 11 deletions
@@ -88,6 +88,9 @@ static const char casetable[] = {
# error >>> "You lose. You will need a translation table for your character set." <<<
#endif
int
rb_memcicmp(const void *x, const void *y, long len)
{
@@ -1732,6 +1735,23 @@ reg_onig_search(regex_t *reg, VALUE str, struct re_registers *regs, void *args_p
ONIG_OPTION_NONE);
}
/* returns byte offset */
static long
rb_reg_search_set_match(VALUE re, VALUE str, long pos, int reverse, int set_backref_str, VALUE *set_match)
@@ -1742,22 +1762,38 @@ rb_reg_search_set_match(VALUE re, VALUE str, long pos, int reverse, int set_back
return -1;
}
- struct reg_onig_search_args args = {
- .pos = pos,
- .range = reverse ? 0 : len,
};
- struct re_registers regs = {0};
- OnigPosition result = rb_reg_onig_match(re, str, reg_onig_search, &args, &regs);
- if (result == ONIG_MISMATCH) {
rb_backref_set(Qnil);
return ONIG_MISMATCH;
}
VALUE match = match_alloc(rb_cMatch);
rb_matchext_t *rm = RMATCH_EXT(match);
- rm->regs = regs;
if (set_backref_str) {
RB_OBJ_WRITE(match, &RMATCH(match)->str, rb_str_new4(str));
@@ -1774,7 +1810,7 @@ rb_reg_search_set_match(VALUE re, VALUE str, long pos, int reverse, int set_back
rb_backref_set(match);
if (set_match) *set_match = match;
- return result;
}
long
@@ -4601,9 +4637,6 @@ re_warn(const char *s)
rb_warn("%s", s);
}
-// The process-global timeout for regexp matching
-rb_hrtime_t rb_reg_match_time_limit = 0;
-
// This function is periodically called during regexp matching
bool
rb_reg_timeout_p(regex_t *reg, void *end_time_)