From: Andrew M. Kuchling Date: Wed, 31 Aug 2005 12:55:21 +0000 (+0000) Subject: Apply fix for potential heap overflow in PCRE code (CAN-2005-2491) X-Git-Tag: v2.3.6c1~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=88a8fca519637aa2caf0686cff2b3a16aadcc284;p=thirdparty%2FPython%2Fcpython.git Apply fix for potential heap overflow in PCRE code (CAN-2005-2491) --- diff --git a/Modules/pypcre.c b/Modules/pypcre.c index 6c93326fbc98..7adaa904623d 100644 --- a/Modules/pypcre.c +++ b/Modules/pypcre.c @@ -1163,7 +1163,18 @@ read_repeat_counts(const uschar *p, int *minp, int *maxp, const char **errorptr) int min = 0; int max = -1; +/* Read the minimum value and do a paranoid check: a negative value indicates +an integer overflow. */ + while ((pcre_ctypes[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0'; +if (min < 0 || min > 65535) + { + *errorptr = ERR5; + return p; + } + +/* Read the maximum value if there is one, and again do a paranoid check +on its size. Also, max must not be less than min. */ if (*p == '}') max = min; else { @@ -1171,6 +1182,11 @@ if (*p == '}') max = min; else { max = 0; while((pcre_ctypes[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0'; + if (max < 0 || max > 65535) + { + *errorptr = ERR5; + return p; + } if (max < min) { *errorptr = ERR4; @@ -1179,16 +1195,11 @@ if (*p == '}') max = min; else } } -/* Do paranoid checks, then fill in the required variables, and pass back the -pointer to the terminating '}'. */ +/* Fill in the required variables, and pass back the pointer to the terminating +'}'. */ -if (min > 65535 || max > 65535) - *errorptr = ERR5; -else - { - *minp = min; - *maxp = max; - } +*minp = min; +*maxp = max; return p; }