diff options
| author | TSUYUSATO Kitsune <make.just.on@gmail.com> | 2025-07-28 16:05:41 +0900 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-08-01 10:16:55 +0900 |
| commit | b2da5f3188104a1264b4291f991af1fbbc0e0c07 (patch) | |
| tree | 08d74693e3ee81aeb63debe04f6e138ece9cb464 | |
| parent | 8f611e0c46012e321b39efd629eb5f4f53976863 (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.c | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -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, |
