diff options
author | Hugo van der Sanden <hv@crypt.org> | 2019-08-04 14:07:22 +0100 |
---|---|---|
committer | Karl Williamson <khw@cpan.org> | 2021-05-31 08:05:43 -0600 |
commit | e096e509321e540009a195ee8530c7dd07c62125 (patch) | |
tree | e2822d2919036316e2f2de1546bb6ca703b5c593 /regcomp.c | |
parent | 756cf5b8e3f0e9bf26a32dd9207ba46999b12d8f (diff) | |
download | perl-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.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -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 */ } |