about summary refs log tree commit diff
path: root/sysdeps/ieee754
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-06-23 20:17:13 +0000
committerJoseph Myers <joseph@codesourcery.com>2014-06-23 20:17:13 +0000
commit46a3d3c7d60db15ea65470800bcba695f55ce6f6 (patch)
treecdd0d3a65570192d02256ef8c09baa0e0d347c5e /sysdeps/ieee754
parent863893ec95f316a3d156d487b99242ee1b52f803 (diff)
downloadglibc-46a3d3c7d60db15ea65470800bcba695f55ce6f6.tar.gz
glibc-46a3d3c7d60db15ea65470800bcba695f55ce6f6.tar.xz
glibc-46a3d3c7d60db15ea65470800bcba695f55ce6f6.zip
Set errno for y1 overflow (bug 17050).
This patch fixes bug 17050, missing errno setting for y1 overflow (for
small positive arguments).  An appropriate check is added for overflow
directly in the __ieee754_y1 implementation, similar to the check
present for yn (doing it there rather than in the wrapper also avoids
yn needing to repeat the check when called for order 1 or -1 and it
uses __ieee754_y1).

Tested x86_64 and x86; no ulps update needed.  Also tested for mips64
to verify the ldbl-128 fix (the ldbl-128ibm code just #includes the
ldbl-128 file).

	[BZ #17050]
	* sysdeps/ieee754/dbl-64/e_j1.c: Include <errno.h>.
	(__ieee754_y1): Set errno if return value overflows.
	* sysdeps/ieee754/flt-32/e_j1f.c: Include <errno.h>.
	(__ieee754_y1f): Set errno if return value overflows.
	* sysdeps/ieee754/ldbl-128/e_j1l.c: Include <errno.h>.
	(__ieee754_y1l): Set errno if return value overflows.
	* sysdeps/ieee754/ldbl-96/e_j1l.c: Include <errno.h>.
	(__ieee754_y1l): Set errno if return value overflows.
	* math/auto-libm-test-in: Add more tests of y0, y1 and yn.
	* math/auto-libm-test-out: Regenerated.
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r--sysdeps/ieee754/dbl-64/e_j1.c6
-rw-r--r--sysdeps/ieee754/flt-32/e_j1f.c6
-rw-r--r--sysdeps/ieee754/ldbl-128/e_j1l.c8
-rw-r--r--sysdeps/ieee754/ldbl-96/e_j1l.c6
4 files changed, 22 insertions, 4 deletions
diff --git a/sysdeps/ieee754/dbl-64/e_j1.c b/sysdeps/ieee754/dbl-64/e_j1.c
index bc7ca0609f..b7b8a9a644 100644
--- a/sysdeps/ieee754/dbl-64/e_j1.c
+++ b/sysdeps/ieee754/dbl-64/e_j1.c
@@ -58,6 +58,7 @@
  *	   by method mentioned above.
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -205,7 +206,10 @@ __ieee754_y1 (double x)
     }
   if (__glibc_unlikely (ix <= 0x3c900000))              /* x < 2**-54 */
     {
-      return (-tpi / x);
+      z = -tpi / x;
+      if (__isinf (z))
+	__set_errno (ERANGE);
+      return z;
     }
   z = x * x;
   u1 = U0[0] + z * U0[1]; z2 = z * z;
diff --git a/sysdeps/ieee754/flt-32/e_j1f.c b/sysdeps/ieee754/flt-32/e_j1f.c
index a1809680f8..920e4b8b6d 100644
--- a/sysdeps/ieee754/flt-32/e_j1f.c
+++ b/sysdeps/ieee754/flt-32/e_j1f.c
@@ -13,6 +13,7 @@
  * ====================================================
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -135,7 +136,10 @@ __ieee754_y1f(float x)
 		return z;
 	}
 	if(__builtin_expect(ix<=0x33000000, 0)) {    /* x < 2**-25 */
-	    return(-tpi/x);
+	    z = -tpi / x;
+	    if (__isinff (z))
+		__set_errno (ERANGE);
+	    return z;
 	}
 	z = x*x;
 	u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4])));
diff --git a/sysdeps/ieee754/ldbl-128/e_j1l.c b/sysdeps/ieee754/ldbl-128/e_j1l.c
index 1264c95d49..f24dfa9f8b 100644
--- a/sysdeps/ieee754/ldbl-128/e_j1l.c
+++ b/sysdeps/ieee754/ldbl-128/e_j1l.c
@@ -95,6 +95,7 @@
     License along with this library; if not, see
     <http://www.gnu.org/licenses/>.  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <float.h>
@@ -852,7 +853,12 @@ __ieee754_y1l (long double x)
     }
   xx = fabsl (x);
   if (xx <= 0x1p-114)
-    return -TWOOPI / x;
+    {
+      z = -TWOOPI / x;
+      if (__isinfl (z))
+	__set_errno (ERANGE);
+      return z;
+    }
   if (xx <= 2.0L)
     {
       /* 0 <= x <= 2 */
diff --git a/sysdeps/ieee754/ldbl-96/e_j1l.c b/sysdeps/ieee754/ldbl-96/e_j1l.c
index 5c0a2e1992..88fcf1399c 100644
--- a/sysdeps/ieee754/ldbl-96/e_j1l.c
+++ b/sysdeps/ieee754/ldbl-96/e_j1l.c
@@ -71,6 +71,7 @@
  *	   by method mentioned above.
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -234,7 +235,10 @@ __ieee754_y1l (long double x)
     }
   if (__glibc_unlikely (ix <= 0x3fbe))
     {				/* x < 2**-65 */
-      return (-tpi / x);
+      z = -tpi / x;
+      if (__isinfl (z))
+	__set_errno (ERANGE);
+      return z;
     }
   z = x * x;
  u = U0[0] + z * (U0[1] + z * (U0[2] + z * (U0[3] + z * (U0[4] + z * U0[5]))));