summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-06-30 16:31:43 -0400
committerRich Felker <dalias@aerifal.cx>2011-06-30 16:31:43 -0400
commitf6fd351c703a2843959b3be83078d9dce33f30f3 (patch)
tree0ee99bf56d4a10d72707b4e1e1625e0e289aaf18
parente5cb55fedd811f71cd91ef097a8a4a4964d8c564 (diff)
downloadmusl-f6fd351c703a2843959b3be83078d9dce33f30f3.tar.gz
musl-f6fd351c703a2843959b3be83078d9dce33f30f3.tar.bz2
musl-f6fd351c703a2843959b3be83078d9dce33f30f3.tar.xz
musl-f6fd351c703a2843959b3be83078d9dce33f30f3.zip
catch invalid ld80 bit patterns and treat them as nan
this should not be necessary - the invalid bit patterns cannot be created except through type punning. however, some broken gnu software is passing them to printf and triggering dangerous stack-smashing, so let's catch them anyway...
-rw-r--r--src/math/__fpclassifyl.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/math/__fpclassifyl.c b/src/math/__fpclassifyl.c
index 4f93bef1..4f4f37a7 100644
--- a/src/math/__fpclassifyl.c
+++ b/src/math/__fpclassifyl.c
@@ -7,10 +7,10 @@ int __fpclassifyl(long double __x)
union {
long double __ld;
__uint16_t __hw[5];
- __uint64_t __m;
+ __int64_t __m;
} __y = { __x };
int __ee = __y.__hw[4]&0x7fff;
if (!__ee) return __y.__m ? FP_SUBNORMAL : FP_ZERO;
if (__ee==0x7fff) return __y.__m ? FP_NAN : FP_INFINITE;
- return FP_NORMAL;
+ return __y.__m < 0 ? FP_NORMAL : FP_NAN;
}