From: Ilia Alshanetsky Date: Sun, 3 Jun 2007 18:53:51 +0000 (+0000) Subject: MFB: Corrected fix for CVE-2007-2872 X-Git-Tag: BEFORE_IMPORT_OF_MYSQLND~552 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9cfd000ba31ad83277aa4049a7c7265e4dd0aedf;p=php MFB: Corrected fix for CVE-2007-2872 --- diff --git a/ext/standard/string.c b/ext/standard/string.c index 53791b0868..e7623bc7fb 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3083,7 +3083,7 @@ static char* php_chunk_split(char *src, int srclen, char *end, int endlen, int c int chunks; /* complete chunks! */ int restlen; int charsize = sizeof(char); - int out_len; + float out_len; if (str_type == IS_UNICODE) { charsize = sizeof(UChar); @@ -3092,13 +3092,15 @@ static char* php_chunk_split(char *src, int srclen, char *end, int endlen, int c chunks = srclen / chunklen; restlen = srclen - chunks * chunklen; /* srclen % chunklen */ - out_len = (srclen + (chunks + 1) * endlen + 1); + out_len = chunks + 1; + out_len *= endlen; + out_len += srclen + 1; if ((out_len > INT_MAX || out_len <= 0) || ((out_len * charsize) > INT_MAX || (out_len * charsize) <= 0)) { return NULL; } - dest = safe_emalloc(out_len, charsize, 0); + dest = safe_emalloc((int)out_len, charsize, 0); for (p = src, q = dest; p < (src + charsize * (srclen - chunklen + 1)); ) { memcpy(q, p, chunklen * charsize); diff --git a/ext/standard/tests/strings/chunk_split.phpt b/ext/standard/tests/strings/chunk_split.phpt index cfb817def1..f25cee9457 100644 --- a/ext/standard/tests/strings/chunk_split.phpt +++ b/ext/standard/tests/strings/chunk_split.phpt @@ -12,6 +12,12 @@ $b=1; $c=str_repeat("B", 65535); var_dump(chunk_split($a,$b,$c)); +$a=str_repeat("B", 65536); +$b=1; +$c=str_repeat("B", 65536); +var_dump(chunk_split($a,$b,$c)); + + ?> --EXPECT-- a-b-c- @@ -25,3 +31,4 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX test|end bool(false) +bool(false)