diff options
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/real.c | 10 | 
2 files changed, 10 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc2c88b905f..6434f60d1e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-11-17  Graham Stott  <graham.stott@btinternet.com> + +	* real.c (real_to_decimal): Fix buffer overrun when buffer size +	is smaller than representation. +  2002-11-17  Kazu Hirata  <kazu@cs.umass.edu>  	* builtins.c: Fix formatting. diff --git a/gcc/real.c b/gcc/real.c index 3bf46370bbb..d9a4b801e3d 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -1485,6 +1485,11 @@ real_to_decimal (str, r_orig, buf_size, digits, crop_trailing_zeros)        abort ();      } +  /* Bound the number of digits printed by the size of the representation.  */ +  max_digits = SIGNIFICAND_BITS * M_LOG10_2; +  if (digits == 0 || digits > max_digits) +    digits = max_digits; +    /* Estimate the decimal exponent, and compute the length of the string it       will print as.  Be conservative and add one to account for possible       overflow or rounding error.  */ @@ -1499,11 +1504,6 @@ real_to_decimal (str, r_orig, buf_size, digits, crop_trailing_zeros)    if (digits > max_digits)      digits = max_digits; -  /* Bound the number of digits printed by the size of the representation.  */ -  max_digits = SIGNIFICAND_BITS * M_LOG10_2; -  if (digits == 0 || digits > max_digits) -    digits = max_digits; -    one = real_digit (1);    ten = ten_to_ptwo (0);  | 

