]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Handle non-normal FP numbers in printf.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 25 Jun 2015 08:44:53 +0000 (09:44 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 25 Jun 2015 08:44:53 +0000 (09:44 +0100)
src/libutil/printf.c

index 64deab209046b98f7b9091252ee0ca27ff626501..14e372f4e3ea0ad627cb9b7d3b5a5e177a5cdeaf 100644 (file)
@@ -577,43 +577,57 @@ rspamd_vprintf_common (rspamd_printf_append_func func,
                                else {
                                        f = (long double) va_arg (args, long double);
                                }
-                               p = numbuf;
-                               last = p + sizeof (numbuf);
-                               if (f < 0) {
-                                       *p++ = '-';
-                                       f = -f;
-                               }
-                               if (frac_width == 0) {
-                                       frac_width = 6;
-                               }
 
-                               ui64 = (gint64) f;
+                               if (isnormal (f)) {
+                                       p = numbuf;
+                                       last = p + sizeof (numbuf);
+                                       if (f < 0) {
+                                               *p++ = '-';
+                                               f = -f;
+                                       }
+                                       if (frac_width == 0) {
+                                               frac_width = 6;
+                                       }
 
-                               p = rspamd_sprintf_num (p, last, ui64, zero, 0, width);
+                                       ui64 = (gint64) f;
 
-                               if (frac_width) {
+                                       p = rspamd_sprintf_num (p, last, ui64, zero, 0, width);
 
-                                       if (p < last) {
-                                               *p++ = '.';
-                                       }
+                                       if (frac_width) {
 
-                                       scale = 1.0;
+                                               if (p < last) {
+                                                       *p++ = '.';
+                                               }
 
-                                       for (i = 0; i < frac_width; i++) {
-                                               scale *= 10.0;
-                                       }
+                                               scale = 1.0;
 
-                                       /*
-                                        * (gint64) cast is required for msvc6:
-                                        * it can not convert guint64 to double
-                                        */
-                                       ui64 = (guint64) ((f - (gint64) ui64) * scale);
+                                               for (i = 0; i < frac_width; i++) {
+                                                       scale *= 10.0;
+                                               }
 
-                                       p = rspamd_sprintf_num (p, last, ui64, '0', 0, frac_width);
-                               }
+                                               /*
+                                                * (gint64) cast is required for msvc6:
+                                                * it can not convert guint64 to double
+                                                */
+                                               ui64 = (guint64) ((f - (gint64) ui64) * scale);
 
-                               slen = p - numbuf;
-                               RSPAMD_PRINTF_APPEND (numbuf, slen);
+                                               p = rspamd_sprintf_num (p, last, ui64, '0', 0, frac_width);
+                                       }
+
+                                       slen = p - numbuf;
+                                       RSPAMD_PRINTF_APPEND (numbuf, slen);
+                               }
+                               else if (isnan (f)) {
+                                       RSPAMD_PRINTF_APPEND ("NaN", 3);
+                               }
+                               else {
+                                       if (signbit (f)) {
+                                               RSPAMD_PRINTF_APPEND ("-Inf", 4);
+                                       }
+                                       else {
+                                               RSPAMD_PRINTF_APPEND ("+Inf", 4);
+                                       }
+                               }
 
                                continue;