iliaa Sat Jan 13 16:31:36 2007 UTC Modified files: (Branch: PHP_4_4) /php-src/ext/standard formatted_print.c Log: MFH: Improve validation of argnum, width and precision. http://cvs.php.net/viewvc.cgi/php-src/ext/standard/formatted_print.c?r1=1.59.2.15.2.3&r2=1.59.2.15.2.4&diff_format=u Index: php-src/ext/standard/formatted_print.c diff -u php-src/ext/standard/formatted_print.c:1.59.2.15.2.3 php-src/ext/standard/formatted_print.c:1.59.2.15.2.4 --- php-src/ext/standard/formatted_print.c:1.59.2.15.2.3 Fri Jan 12 02:04:37 2007 +++ php-src/ext/standard/formatted_print.c Sat Jan 13 16:31:36 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: formatted_print.c,v 1.59.2.15.2.3 2007/01/12 02:04:37 iliaa Exp $ */ +/* $Id: formatted_print.c,v 1.59.2.15.2.4 2007/01/13 16:31:36 iliaa Exp $ */ #include <math.h> /* modf() */ #include "php.h" @@ -441,7 +441,7 @@ } -inline static long +inline static int php_sprintf_getnumber(char *buffer, int *pos) { char *endptr; @@ -453,7 +453,12 @@ } PRINTF_DEBUG(("sprintf_getnumber: number was %d bytes long\n", i)); *pos += i; - return num; + + if (num >= INT_MAX || num < 0) { + return -1; + } else { + return (int) num; + } } /* {{{ php_formatted_print @@ -486,10 +491,9 @@ { zval ***args, **z_format, **array; int argc, size = 240, inpos = 0, outpos = 0, temppos; - int alignment, currarg, adjusting; + int alignment, currarg, adjusting, argnum, width, precision; char *format, *result, padding; int always_sign; - long argnum, width, precision; argc = ZEND_NUM_ARGS(); @@ -553,10 +557,10 @@ if (format[temppos] == '$') { argnum = php_sprintf_getnumber(format, &inpos); - if (argnum == 0) { + if (argnum <= 0) { efree(result); efree(args); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zero is not a valid argument number"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument number must be greater then zero."); return NULL; } @@ -593,7 +597,12 @@ /* after modifiers comes width */ if (isdigit((int)format[inpos])) { PRINTF_DEBUG(("sprintf: getting width\n")); - width = php_sprintf_getnumber(format, &inpos); + if ((width = php_sprintf_getnumber(format, &inpos)) < 0) { + efree(result); + efree(args); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Width must be greater then zero and less then %d.", INT_MAX); + return NULL; + } adjusting |= ADJ_WIDTH; } else { width = 0; @@ -605,7 +614,12 @@ inpos++; PRINTF_DEBUG(("sprintf: getting precision\n")); if (isdigit((int)format[inpos])) { - precision = php_sprintf_getnumber(format, &inpos); + if ((precision = php_sprintf_getnumber(format, &inpos)) < 0) { + efree(result); + efree(args); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Precision must be greater then zero and less then %d.", INT_MAX); + return NULL; + } adjusting |= ADJ_PRECISION; expprec = 1; } else {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php