From dd88eabcdaecfe56bd4dd50fcb557ad59bed4855 Mon Sep 17 00:00:00 2001 From: Jitka Plesnikova Date: Thu, 7 Jan 2021 12:50:21 +0100 Subject: [PATCH] regcomp.c: Prevent integer overflow from nested regex quantifiers. (CVE-2020-10543) On 32bit systems the size calculations for nested regular expression quantifiers could overflow causing heap memory corruption. --- AUTHORS | 1 + perl.h | 2 ++ regcomp.c | 6 ++++++ t/re/pat.t | 1 + 4 files changed, 10 insertions(+) diff --git a/AUTHORS b/AUTHORS index 9589b5b..b69783a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -558,6 +558,7 @@ John Holdsworth John Hughes John Kristian John L. Allen +John Lightsey John Macdonald John Malmberg John Nolan diff --git a/perl.h b/perl.h index e532af2..9806c58 100644 --- a/perl.h +++ b/perl.h @@ -1758,6 +1758,8 @@ typedef UVTYPE UV; # endif #endif +#define SSize_t_MAX (SSize_t)(~(size_t)0 >> 1) + #ifndef HAS_QUAD # undef PERL_NEED_MY_HTOLE64 # undef PERL_NEED_MY_LETOH64 diff --git a/regcomp.c b/regcomp.c index 57505f3..a02c296 100644 --- a/regcomp.c +++ b/regcomp.c @@ -3848,6 +3848,12 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, "Quantifier unexpected on zero-length expression"); } + if ( ( minnext > 0 && mincount >= SSize_t_MAX / minnext ) + || min >= SSize_t_MAX - minnext * mincount ) + { + FAIL("Regexp out of space"); + } + min += minnext * mincount; is_inf_internal |= ((maxcount == REG_INFTY && (minnext + deltanext) > 0) diff --git a/t/re/pat.t b/t/re/pat.t index e328fbd..214a14b 100644 --- a/t/re/pat.t +++ b/t/re/pat.t @@ -16,6 +16,7 @@ $| = 1; BEGIN { chdir 't' if -d 't'; @INC = ('../lib','.'); + require Config; import Config; require './test.pl'; } -- 2.26.2