summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTSUYUSATO Kitsune <make.just.on@gmail.com>2025-07-28 16:05:41 +0900
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2025-08-01 10:16:55 +0900
commitb2da5f3188104a1264b4291f991af1fbbc0e0c07 (patch)
tree08d74693e3ee81aeb63debe04f6e138ece9cb464
parent8f611e0c46012e321b39efd629eb5f4f53976863 (diff)
Port a Oniguruma patch: Integer overflow in forward_search_range()
https://github.com/kkos/oniguruma/commit/db64ef3189f54917a5008a02bdb000adc514a90a Co-Authored-By: K.Kosako <kkos@users.noreply.github.com>
-rw-r--r--regexec.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/regexec.c b/regexec.c
index 47fc88c9c2..4a67d428ed 100644
--- a/regexec.c
+++ b/regexec.c
@@ -4683,14 +4683,14 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
}
p = s;
- if (reg->dmin > 0) {
+ if (reg->dmin != 0) {
+ if (end - p <= reg->dmin) return 0; /* fail */
if (ONIGENC_IS_SINGLEBYTE(reg->enc)) {
p += reg->dmin;
}
else {
UChar *q = p + reg->dmin;
- if (q >= end) return 0; /* fail */
while (p < q) p += enclen(reg->enc, p, end);
}
}
@@ -4727,7 +4727,7 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
}
if (p && p < range) {
- if (p - reg->dmin < s) {
+ if (p - s < reg->dmin) {
retry_gate:
pprev = p;
p += enclen(reg->enc, p, end);
@@ -4771,10 +4771,11 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
*low_prev = onigenc_get_prev_char_head(reg->enc,
(pprev ? pprev : str), p, end);
}
+ *high = p;
}
else {
if (reg->dmax != ONIG_INFINITE_DISTANCE) {
- if (p < str + reg->dmax) {
+ if (p - str < reg->dmax) {
*low = (UChar* )str;
if (low_prev)
*low_prev = onigenc_get_prev_char_head(reg->enc, str, *low, end);
@@ -4795,9 +4796,12 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
}
}
}
+ /* no needs to adjust *high, *high is used as range check only */
+ if (p - str < reg->dmin)
+ *high = (UChar* )str;
+ else
+ *high = p - reg->dmin;
}
- /* no needs to adjust *high, *high is used as range check only */
- *high = p - reg->dmin;
#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr,