re PR fortran/32554 ([4.2 Only] Bug in P formatting)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 1 Jul 2007 15:46:33 +0000 (15:46 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 1 Jul 2007 15:46:33 +0000 (15:46 +0000)
2007-07-01  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libgfortran/32554
* io/write.c (output_float): Set edigits to a fixed size, avoiding
variation in field width calculation and eliminate buffer overrun.

From-SVN: r126173

libgfortran/ChangeLog
libgfortran/io/write.c

index 1b6a6bdcd9ab01412ce9027b2f08635ee9fc9c8d..ac234b5d1ebe2781d42d9886065552d967b616ac 100644 (file)
@@ -1,3 +1,9 @@
+2007-07-01  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/32554
+       * io/write.c (output_float): Set edigits to a fixed size, avoiding
+       variation in field width calculation and eliminate buffer overrun.
+
 2007-07-01  Janne Blomqvist  <jb@gcc.gnu.org>
 
         * runtime/memory.c (internal_realloc): Use index_type for size
index f156d19862be03566b17f8f0b22814169fd9d435..766d268993b87b0f1b56c189daa6f2b2d06f4153 100644 (file)
@@ -466,7 +466,6 @@ output_float (st_parameter_dt *dtp, const fnode *f, GFC_REAL_LARGEST value)
   int nblanks;
   int i;
   sign_t sign;
-  double abslog;
 
   ft = f->format;
   w = f->u.real.w;
@@ -495,21 +494,9 @@ output_float (st_parameter_dt *dtp, const fnode *f, GFC_REAL_LARGEST value)
        value = value + 0.5;
     }
 
-  /* Printf always prints at least two exponent digits.  */
-  if (value == 0)
-    edigits = 2;
-  else
-    {
-#if defined(HAVE_GFC_REAL_10) || defined(HAVE_GFC_REAL_16)
-      abslog = fabs((double) log10l(value));
-#else
-      abslog = fabs(log10(value));
-#endif
-      if (abslog < 100)
-       edigits = 2;
-      else
-        edigits = 1 + (int) log10(abslog);
-    }
+  /* printf pads blanks for us on the exponent so we just need it big enough
+     to handle the largest number of exponent digits expected.  */
+  edigits=4;
 
   if (ft == FMT_F || ft == FMT_EN
       || ((ft == FMT_D || ft == FMT_E) && dtp->u.p.scale_factor != 0))