helly Mon Dec 26 14:01:45 2005 EDT Modified files: (Branch: PHP_4_4) /php-src/main snprintf.c Log: - SWH (WS + memory corruption fix) http://cvs.php.net/viewcvs.cgi/php-src/main/snprintf.c?r1=1.17.4.12&r2=1.17.4.12.2.1&diff_format=u Index: php-src/main/snprintf.c diff -u php-src/main/snprintf.c:1.17.4.12 php-src/main/snprintf.c:1.17.4.12.2.1 --- php-src/main/snprintf.c:1.17.4.12 Fri Apr 8 05:44:53 2005 +++ php-src/main/snprintf.c Mon Dec 26 14:01:45 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: snprintf.c,v 1.17.4.12 2005/04/08 05:44:53 sniper Exp $ */ +/* $Id: snprintf.c,v 1.17.4.12.2.1 2005/12/26 14:01:45 helly Exp $ */ /* ==================================================================== * Copyright (c) 1995-1998 The Apache Group. All rights reserved. @@ -111,8 +111,7 @@ * which is a pointer to the END of the buffer + 1 (i.e. if the buffer * is declared as buf[ 100 ], buf_end should be &buf[ 100 ]) */ -char * -ap_php_conv_10(register wide_int num, register bool_int is_unsigned, +char * ap_php_conv_10(register wide_int num, register bool_int is_unsigned, register bool_int * is_negative, char *buf_end, register int *len) { register char *p = buf_end; @@ -157,6 +156,7 @@ } /* If you change this value then also change bug24640.phpt. + * Also NDIG must be reasonable smaller than NUM_BUF_SIZE. */ #define NDIG 80 @@ -167,8 +167,7 @@ * The sign is returned in the is_negative argument (and is not placed * in buf). */ -char * - ap_php_conv_fp(register char format, register double num, +char * ap_php_conv_fp(register char format, register double num, boolean_e add_dp, int precision, bool_int * is_negative, char *buf, int *len) { register char *s = buf; @@ -201,9 +200,14 @@ *s++ = '.'; } } else { + int addz = decimal_point >= NDIG ? decimal_point - NDIG + 1 : 0; + decimal_point -= addz; while (decimal_point-- > 0) { *s++ = *p++; } + while (addz-- > 0) { + *s++ = '0'; + } if (precision > 0 || add_dp) { *s++ = '.'; } @@ -260,8 +264,7 @@ * which is a pointer to the END of the buffer + 1 (i.e. if the buffer * is declared as buf[ 100 ], buf_end should be &buf[ 100 ]) */ -char * - ap_php_conv_p2(register u_wide_int num, register int nbits, +char * ap_php_conv_p2(register u_wide_int num, register int nbits, char format, char *buf_end, register int *len) { register int mask = (1 << nbits) - 1; @@ -293,8 +296,7 @@ */ -char * -ap_php_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag, char *buf) +char * ap_php_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag, char *buf) { register int r2; int mvl; @@ -316,19 +318,21 @@ * Do integer part */ if (fi != 0) { - p1 = &buf[NDIG]; while (fi != 0) { fj = modf(fi / 10, &fi); if (p1 <= &buf[0]) { mvl = NDIG - ndigits; - memmove(&buf[mvl], &buf[0], NDIG-mvl-1); + if (ndigits > 0) { + memmove(&buf[mvl], &buf[0], NDIG-mvl-1); + } p1 += mvl; } *--p1 = (int) ((fj + .03) * 10) + '0'; r2++; } - while (p1 < &buf[NDIG]) + while (p1 < &buf[NDIG]) { *p++ = *p1++; + } } else if (arg > 0) { while ((fj = arg * 10) < 1) { if (!eflag && (r2 * -1) < ndigits) { @@ -382,14 +386,12 @@ return (buf); } -char * -ap_php_ecvt(double arg, int ndigits, int *decpt, int *sign, char *buf) +char * ap_php_ecvt(double arg, int ndigits, int *decpt, int *sign, char *buf) { return (ap_php_cvt(arg, ndigits, decpt, sign, 1, buf)); } -char * -ap_php_fcvt(double arg, int ndigits, int *decpt, int *sign, char *buf) +char * ap_php_fcvt(double arg, int ndigits, int *decpt, int *sign, char *buf) { return (ap_php_cvt(arg, ndigits, decpt, sign, 0, buf)); } @@ -399,8 +401,7 @@ * minimal length string */ -char * -ap_php_gcvt(double number, int ndigit, char *buf, boolean_e altform) +char * ap_php_gcvt(double number, int ndigit, char *buf, boolean_e altform) { int sign, decpt; register char *p1, *p2;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php