re PR fortran/32554 ([4.2 Only] Bug in P formatting)

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
This commit is contained in:
Jerry DeLisle 2007-07-01 15:46:33 +00:00
parent 36bd43039b
commit c767280aa7
2 changed files with 9 additions and 16 deletions

View 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

View 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))