aboutsummaryrefslogtreecommitdiffstats
path: root/re.c
diff options
context:
space:
mode:
authorLuke Gruber <luke.gru@gmail.com>2023-12-30 13:26:59 -0500
committerJeremy Evans <code@jeremyevans.net>2024-01-01 13:28:26 -0800
commite12d4c654e3cb7a4473014610bc3bae41aaf811e (patch)
tree3184f19e8898ca9af24dd5d6ee22afad83fa0530 /re.c
parent676748abcad62c021fc122d137f177d3c0f0f7a8 (diff)
downloadruby-e12d4c654e3cb7a4473014610bc3bae41aaf811e.tar.gz
Don't create T_MATCH object if /regexp/.match(string) doesn't match
Fixes [Bug #20104]
Diffstat (limited to 're.c')
-rw-r--r--re.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/re.c b/re.c
index cb8cc865b2..bf4dc5ccbf 100644
--- a/re.c
+++ b/re.c
@@ -1747,15 +1747,18 @@ rb_reg_search_set_match(VALUE re, VALUE str, long pos, int reverse, int set_back
.range = reverse ? 0 : len,
};
- VALUE match = match_alloc(rb_cMatch);
- struct re_registers *regs = RMATCH_REGS(match);
+ struct re_registers regs = {0};
- OnigPosition result = rb_reg_onig_match(re, str, reg_onig_search, &args, regs);
+ 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));
}