diff options
author | Joseph Myers <joseph@codesourcery.com> | 2012-03-28 09:32:12 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2012-03-28 09:32:12 +0000 |
commit | 41bf21a1e72c907b1a065727c3b5da43821ca6b0 (patch) | |
tree | 93612a0bb49dfead686c656b36da812fb810c2cf /sysdeps/ieee754/k_standard.c | |
parent | bdc6f13012da775a124596c81e40139ee8d2ca91 (diff) | |
download | glibc-41bf21a1e72c907b1a065727c3b5da43821ca6b0.tar.gz glibc-41bf21a1e72c907b1a065727c3b5da43821ca6b0.tar.xz glibc-41bf21a1e72c907b1a065727c3b5da43821ca6b0.zip |
Avoid overflows from long double functions using __kernel_standard.
Diffstat (limited to 'sysdeps/ieee754/k_standard.c')
-rw-r--r-- | sysdeps/ieee754/k_standard.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/sysdeps/ieee754/k_standard.c b/sysdeps/ieee754/k_standard.c index 5d84543b95..c3326d9ef5 100644 --- a/sysdeps/ieee754/k_standard.c +++ b/sysdeps/ieee754/k_standard.c @@ -16,6 +16,7 @@ static char rcsid[] = "$NetBSD: k_standard.c,v 1.6 1995/05/10 20:46:35 jtc Exp $ #include <math.h> #include <math_private.h> +#include <float.h> #include <errno.h> #include <assert.h> @@ -998,3 +999,34 @@ __kernel_standard_f(float x, float y, int type) { return __kernel_standard(x, y, type); } + +long double +__kernel_standard_l (long double x, long double y, int type) +{ + double dx, dy; + if (isfinite (x)) + { + long double ax = fabsl (x); + if (ax > DBL_MAX) + dx = __copysignl (DBL_MAX, x); + else if (ax > 0 && ax < DBL_MIN) + dx = __copysignl (DBL_MIN, x); + else + dx = x; + } + else + dx = x; + if (isfinite (y)) + { + long double ay = fabsl (y); + if (ay > DBL_MAX) + dy = __copysignl (DBL_MAX, y); + else if (ay > 0 && ay < DBL_MIN) + dy = __copysignl (DBL_MIN, y); + else + dy = y; + } + else + dy = y; + return __kernel_standard (dx, dy, type); +} |