From c23a2f6a798cabd3a51274f2fbd214b7286720f3 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 14 Aug 2013 18:49:45 +0200 Subject: libc: Prevent infinite recursion when modf is called with NaN or Inf argument. (apply richard millers / modf-nan patch from sources) --- sys/src/libc/port/frexp.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'sys/src/libc') diff --git a/sys/src/libc/port/frexp.c b/sys/src/libc/port/frexp.c index 669f12152..e2f4fb072 100644 --- a/sys/src/libc/port/frexp.c +++ b/sys/src/libc/port/frexp.c @@ -89,6 +89,16 @@ modf(double d, double *ip) FPdbleword x; int e; + x.x = d; + e = (x.hi >> SHIFT) & MASK; + if(e == MASK){ + *ip = d; + if(x.lo != 0 || (x.hi & 0xfffffL != 0)) /* NaN */ + return d; + /* ±Inf */ + x.hi &= 0x80000000L; + return x.x; + } if(d < 1) { if(d < 0) { x.x = modf(-d, ip); @@ -98,8 +108,7 @@ modf(double d, double *ip) *ip = 0; return d; } - x.x = d; - e = ((x.hi >> SHIFT) & MASK) - BIAS; + e -= BIAS; if(e <= SHIFT+1) { x.hi &= ~(0x1fffffL >> e); x.lo = 0; -- cgit v1.2.3