catch invalid ld80 bit patterns and treat them as nan
authorRich Felker <dalias@aerifal.cx>
Thu, 30 Jun 2011 20:31:43 +0000 (16:31 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 30 Jun 2011 20:31:43 +0000 (16:31 -0400)
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...

src/math/__fpclassifyl.c

index 4f93bef..4f4f37a 100644 (file)
@@ -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;
 }