From 8df86a8394d0ea121f2066efe618f2b1cc799be3 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 20 Aug 2013 19:41:15 +0000 Subject: [PATCH] Fix cproj handling of (finite, NaN) arguments (bug 15531). backport of c980f2f4fe0f5d301f706017a1f7e4e942193ec0 --- ChangeLog | 16 +++++++++++ NEWS | 14 ++++----- math/libm-test.inc | 40 ++++++++++++++++++++++++++ math/s_cproj.c | 4 +-- math/s_cprojf.c | 4 +-- math/s_cprojl.c | 4 +-- sysdeps/ieee754/ldbl-128ibm/s_cprojl.c | 4 +-- 7 files changed, 67 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9ad07190e0a..bf25bd66409 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2013-08-20 Joseph Myers + + [BZ #15531] + * math/s_cproj.c (__cproj): Only return an infinity if one part of + argument is infinite. + * math/s_cprojf.c (__cprojf): Likewise. + * math/s_cprojl.c (__cprojl): Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_cprojl.c (__cprojl): Likewise. + * math/libm-test.inc (cproj_test_data): Add more tests. + + * sysdeps/unix/sysv/linux/mmap64.c: Include . + + * sysdeps/unix/sysv/linux/mmap64.c (__mmap64) + [MMAP2_PAGE_SHIFT == -1]: Use __getpagesize to determine page + size. Use __ffs to determine corresponding shift. + 2013-08-20 Andreas Arnez * elf/setup-vdso.h (setup_vdso): Fix missing string termination. diff --git a/NEWS b/NEWS index 4d168c50ba5..ab3f353b83b 100644 --- a/NEWS +++ b/NEWS @@ -16,13 +16,13 @@ Version 2.18 14952, 14964, 14981, 14982, 14985, 14991, 14994, 14996, 15000, 15003, 15006, 15007, 15014, 15020, 15022, 15023, 15036, 15054, 15055, 15062, 15078, 15084, 15085, 15086, 15100, 15160, 15214, 15221, 15232, 15234, - 15283, 15285, 15287, 15304, 15305, 15307, 15309, 15327, 15330, 15335, - 15336, 15337, 15339, 15342, 15346, 15359, 15361, 15366, 15380, 15381, - 15394, 15395, 15405, 15406, 15409, 15416, 15418, 15419, 15423, 15424, - 15426, 15429, 15431, 15432, 15441, 15442, 15448, 15465, 15480, 15485, - 15488, 15490, 15492, 15493, 15497, 15506, 15529, 15536, 15553, 15577, - 15583, 15618, 15627, 15631, 15654, 15655, 15666, 15667, 15674, 15711, - 15755, 15759. + 15283, 15285, 15287, 15304, 15305, 15307, 15309, 15327, 15330, 15331, + 15335, 15336, 15337, 15339, 15342, 15346, 15359, 15361, 15366, 15380, + 15381, 15394, 15395, 15405, 15406, 15409, 15416, 15418, 15419, 15423, + 15424, 15426, 15429, 15431, 15432, 15441, 15442, 15448, 15465, 15480, + 15485, 15488, 15490, 15492, 15493, 15497, 15506, 15529, 15536, 15553, + 15577, 15583, 15618, 15627, 15631, 15654, 15655, 15666, 15667, 15674, + 15711, 15755, 15759. * CVE-2013-2207 Incorrectly granting access to another user's pseudo-terminal has been fixed by disabling the use of pt_chown (Bugzilla #15755). diff --git a/math/libm-test.inc b/math/libm-test.inc index 2324d4fd522..3b382af1049 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -7061,11 +7061,51 @@ static const struct test_c_c_data cproj_test_data[] = TEST_c_c (cproj, qnan_value, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, plus_zero, qnan_value, plus_zero, qnan_value, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, minus_zero, qnan_value, minus_zero, qnan_value, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, qnan_value, plus_zero, qnan_value, plus_zero, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, qnan_value, minus_zero, qnan_value, minus_zero, NO_INEXACT_EXCEPTION), + + TEST_c_c (cproj, 1.0, qnan_value, 1.0, qnan_value, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, -1.0, qnan_value, -1.0, qnan_value, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, qnan_value, 1.0, qnan_value, 1.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, qnan_value, -1.0, qnan_value, -1.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, plus_infty, plus_infty, plus_infty, 0.0, NO_INEXACT_EXCEPTION), TEST_c_c (cproj, plus_infty, minus_infty, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), TEST_c_c (cproj, minus_infty, plus_infty, plus_infty, 0.0, NO_INEXACT_EXCEPTION), TEST_c_c (cproj, minus_infty, minus_infty, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, plus_infty, plus_zero, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, plus_infty, minus_zero, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, minus_infty, plus_zero, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, minus_infty, minus_zero, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + + TEST_c_c (cproj, plus_zero, plus_infty, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, plus_zero, minus_infty, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, minus_zero, plus_infty, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, minus_zero, minus_infty, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + + TEST_c_c (cproj, plus_infty, 1.0, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, plus_infty, -1.0, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, minus_infty, 1.0, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, minus_infty, -1.0, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + + TEST_c_c (cproj, 1.0, plus_infty, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, 1.0, minus_infty, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, -1.0, plus_infty, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, -1.0, minus_infty, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + + TEST_c_c (cproj, plus_infty, qnan_value, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, plus_infty, -qnan_value, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, minus_infty, qnan_value, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, minus_infty, -qnan_value, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + + TEST_c_c (cproj, qnan_value, plus_infty, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, qnan_value, minus_infty, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, -qnan_value, plus_infty, plus_infty, 0.0, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, -qnan_value, minus_infty, plus_infty, minus_zero, NO_INEXACT_EXCEPTION), + TEST_c_c (cproj, 1.0, 0.0, 1.0, 0.0, NO_INEXACT_EXCEPTION), TEST_c_c (cproj, 2.0, 3.0, 2.0, 3.0, NO_INEXACT_EXCEPTION), }; diff --git a/math/s_cproj.c b/math/s_cproj.c index c0be4618dbf..98f1a4c4b2e 100644 --- a/math/s_cproj.c +++ b/math/s_cproj.c @@ -24,9 +24,7 @@ __complex__ double __cproj (__complex__ double x) { - if (isnan (__real__ x) && isnan (__imag__ x)) - return x; - else if (!isfinite (__real__ x) || !isfinite (__imag__ x)) + if (__isinf_ns (__real__ x) || __isinf_ns (__imag__ x)) { __complex__ double res; diff --git a/math/s_cprojf.c b/math/s_cprojf.c index 188bbe3beb3..e4dbc181bd3 100644 --- a/math/s_cprojf.c +++ b/math/s_cprojf.c @@ -24,9 +24,7 @@ __complex__ float __cprojf (__complex__ float x) { - if (isnan (__real__ x) && isnan (__imag__ x)) - return x; - else if (!isfinite (__real__ x) || !isfinite (__imag__ x)) + if (__isinf_nsf (__real__ x) || __isinf_nsf (__imag__ x)) { __complex__ float res; diff --git a/math/s_cprojl.c b/math/s_cprojl.c index fbdf2797e4e..b564a83e631 100644 --- a/math/s_cprojl.c +++ b/math/s_cprojl.c @@ -24,9 +24,7 @@ __complex__ long double __cprojl (__complex__ long double x) { - if (isnan (__real__ x) && isnan (__imag__ x)) - return x; - else if (!isfinite (__real__ x) || !isfinite (__imag__ x)) + if (__isinf_nsl (__real__ x) || __isinf_nsl (__imag__ x)) { __complex__ long double res; diff --git a/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c b/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c index 3b4af5423a5..a344e9288fb 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c @@ -24,9 +24,7 @@ __complex__ long double __cprojl (__complex__ long double x) { - if (isnan (__real__ x) && isnan (__imag__ x)) - return x; - else if (!isfinite (__real__ x) || !isfinite (__imag__ x)) + if (__isinf_nsl (__real__ x) || __isinf_nsl (__imag__ x)) { __complex__ long double res; -- 2.47.2