]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Make ap_snprintf() more robust against border situations with
authorMartin Kraemer <martin@apache.org>
Fri, 27 Apr 2001 13:01:28 +0000 (13:01 +0000)
committerMartin Kraemer <martin@apache.org>
Fri, 27 Apr 2001 13:01:28 +0000 (13:01 +0000)
floating point numbers.

Submitted by: Lukas Schroeder <lukas@edeal.de>

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x@88948 13f79535-47bb-0310-9956-ffa450edef68

src/ap/ap_snprintf.c

index 94dd647b1d469223e1060a9201357a2263ae7146..3af535c5b78b6c3fde6b1bdbd2f87daeb4e7849b 100644 (file)
@@ -152,7 +152,7 @@ static char *ap_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag, c
      */
     if (fi != 0) {
        p1 = &buf[NDIG];
-       while (fi != 0) {
+       while (p1 > &buf[0] && fi != 0) {
            fj = modf(fi / 10, &fi);
            *--p1 = (int) ((fj + .03) * 10) + '0';
            r2++;
@@ -931,16 +931,26 @@ API_EXPORT(int) ap_vformatter(int (*flush_func)(ap_vformatter_buff *),
                /*
                 * * We use &num_buf[ 1 ], so that we have room for the sign
                 */
-               s = conv_fp(*fmt, fp_num, alternate_form,
-                       (adjust_precision == NO) ? FLOAT_DIGITS : precision,
-                           &is_negative, &num_buf[1], &s_len);
-               if (is_negative)
-                   prefix_char = '-';
-               else if (print_sign)
-                   prefix_char = '+';
-               else if (print_blank)
-                   prefix_char = ' ';
-               break;
+               if (isnan(fp_num)) {
+                   s = "nan";
+                   s_len = 3;
+               }
+               else if (isinf(fp_num)) {
+                   s = "inf";
+                   s_len = 3;
+               }
+               else {
+                   s = conv_fp(*fmt, fp_num, alternate_form,
+                           (adjust_precision == NO) ? FLOAT_DIGITS : precision,
+                               &is_negative, &num_buf[1], &s_len);
+                   if (is_negative)
+                       prefix_char = '-';
+                   else if (print_sign)
+                       prefix_char = '+';
+                   else if (print_blank)
+                       prefix_char = ' ';
+               }
+               break;
 
 
            case 'g':