summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-04-07 13:50:05 -0400
committerRich Felker <dalias@aerifal.cx>2014-04-16 02:46:05 -0400
commita65824a74fc49b059ecd684a9edba31070a1794f (patch)
treec7c347a0c47f2ecdd89b1ad4a286846ec2e8d086
parent9de00a019e01c8a37a0b54f39be4bd54028fc57f (diff)
downloadmusl-a65824a74fc49b059ecd684a9edba31070a1794f.tar.gz
fix printf rounding with %g for some corner case midpoints
the subsequent rounding code assumes the end pointer (z) accurately reflects the end of significance in the decimal expansion, but for certain large integers, spurious trailing zero slots were left behind when applying the binary exponent. issue reported by Morten Welinder; the analysis of the cause was performed by nsz, who also proposed this change. (cherry picked from commit e94d0692864ecf9522fd6a97610a47a2f718d3de)
-rw-r--r--src/stdio/vfprintf.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
index 0be75498..f6e7f38d 100644
--- a/src/stdio/vfprintf.c
+++ b/src/stdio/vfprintf.c
@@ -308,8 +308,8 @@ static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
*d = x % 1000000000;
carry = x / 1000000000;
}
- if (!z[-1] && z>a) z--;
if (carry) *--a = carry;
+ while (z>a && !z[-1]) z--;
e2-=sh;
}
while (e2<0) {