summaryrefslogtreecommitdiff
path: root/regcomp.c
diff options
context:
space:
mode:
authorHugo van der Sanden <hv@crypt.org>2019-08-04 14:07:22 +0100
committerKarl Williamson <khw@cpan.org>2021-05-31 08:05:43 -0600
commite096e509321e540009a195ee8530c7dd07c62125 (patch)
treee2822d2919036316e2f2de1546bb6ca703b5c593 /regcomp.c
parent756cf5b8e3f0e9bf26a32dd9207ba46999b12d8f (diff)
downloadperl-e096e509321e540009a195ee8530c7dd07c62125.tar.gz
[gh 17847] avoid overflow on delta in study_chunk
delta and pos_delta may hold OPTIMIZE_INFTY to represent infinity.
Diffstat (limited to 'regcomp.c')
-rw-r--r--regcomp.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/regcomp.c b/regcomp.c
index e692d53eb5..81fdffca73 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -5386,13 +5386,25 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
}
min += charlen - min_subtract;
assert (min >= 0);
- delta += min_subtract;
+ if ((SSize_t)min_subtract < OPTIMIZE_INFTY
+ && delta < OPTIMIZE_INFTY - (SSize_t)min_subtract
+ ) {
+ delta += min_subtract;
+ } else {
+ delta = OPTIMIZE_INFTY;
+ }
if (flags & SCF_DO_SUBSTR) {
data->pos_min += charlen - min_subtract;
if (data->pos_min < 0) {
data->pos_min = 0;
}
- data->pos_delta += min_subtract;
+ if ((SSize_t)min_subtract < OPTIMIZE_INFTY
+ && data->pos_delta < OPTIMIZE_INFTY - (SSize_t)min_subtract
+ ) {
+ data->pos_delta += min_subtract;
+ } else {
+ data->pos_delta = OPTIMIZE_INFTY;
+ }
if (min_subtract) {
data->cur_is_floating = 1; /* float */
}