summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/real.c10
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);
OpenPOWER on IntegriCloud