summary refs log tree commit diff
path: root/math/w_atan2.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-03-31 14:56:37 +0000
committerJoseph Myers <joseph@codesourcery.com>2014-03-31 14:56:37 +0000
commit54fa2475d37b9c7afd903eb970362e50ec76f01e (patch)
tree7edfc5402ad7ae934fb27a9b132aaa7950d92262 /math/w_atan2.c
parent757d9dd5c3efa56fac75965abc014faaae7b7895 (diff)
downloadglibc-54fa2475d37b9c7afd903eb970362e50ec76f01e.tar.gz
glibc-54fa2475d37b9c7afd903eb970362e50ec76f01e.tar.xz
glibc-54fa2475d37b9c7afd903eb970362e50ec76f01e.zip
Set errno for atan2 underflow (bug 16349).
This patch fixes bug 16349, missing errno setting for atan2 underflow,
by adding appropriate checks to the existing wrappers.  (As in other
cases, the __kernel_standard support for calling matherr is considered
to be for existing code expecting existing rules for what's considered
an error, even if those don't correspond to a general logical scheme
for what counts as what kind of error, so __set_errno calls are added
directly without any changes to __kernel_standard.)

Tested x86_64 and x86.

	[BZ #16349]
	* math/w_atan2.c: Include <errno.h>.
	(__atan2): Set errno for result underflowing to zero.
	* math/w_atan2f.c: Include <errno.h>.
	(__atan2f): Set errno for result underflowing to zero.
	* math/w_atan2l.c: Include <errno.h>.
	(__atan2l): Set errno for result underflowing to zero.
	* math/auto-libm-test-in: Don't allow missing errno for some atan2
	tests.
	* math/auto-libm-test-out: Regenerated.
Diffstat (limited to 'math/w_atan2.c')
-rw-r--r--math/w_atan2.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/math/w_atan2.c b/math/w_atan2.c
index efbf0b333c..c56d7b6fce 100644
--- a/math/w_atan2.c
+++ b/math/w_atan2.c
@@ -20,6 +20,7 @@
  * wrapper atan2(y,x)
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -27,10 +28,15 @@
 double
 __atan2 (double y, double x)
 {
+  double z;
+
   if (__builtin_expect (x == 0.0 && y == 0.0, 0) && _LIB_VERSION == _SVID_)
     return __kernel_standard (y, x, 3); /* atan2(+-0,+-0) */
 
-  return __ieee754_atan2 (y, x);
+  z = __ieee754_atan2 (y, x);
+  if (__glibc_unlikely (z == 0.0 && y != 0.0 && __finite (x)))
+    __set_errno (ERANGE);
+  return z;
 }
 weak_alias (__atan2, atan2)
 #ifdef NO_LONG_DOUBLE