about summary refs log tree commit diff
path: root/src/math/sincosl.c
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2014-04-11 17:57:30 +0200
committerSzabolcs Nagy <nsz@port70.net>2014-04-11 18:07:08 +0200
commit73c870ed3209b68b5c8c350534508cc9d95a6bcb (patch)
treed2d59479ac1cb75e6ef6a8e707e7c0bb3b1ebb2d /src/math/sincosl.c
parent6fbdeff0e51f6afc38fbb1476a4db81322779da4 (diff)
downloadmusl-73c870ed3209b68b5c8c350534508cc9d95a6bcb.tar.gz
musl-73c870ed3209b68b5c8c350534508cc9d95a6bcb.tar.xz
musl-73c870ed3209b68b5c8c350534508cc9d95a6bcb.zip
math: fix aliasing violation in long double wrappers
modfl and sincosl were passing long double* instead of double*
to the wrapped double precision functions (on archs where long
double and double have the same size).
This is fixed now by using temporaries (this is not optimized
to a single branch so the generated code is a bit bigger).
Found by Morten Welinder.
Diffstat (limited to 'src/math/sincosl.c')
-rw-r--r--src/math/sincosl.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/math/sincosl.c b/src/math/sincosl.c
index 2c600801..d3ac1c4c 100644
--- a/src/math/sincosl.c
+++ b/src/math/sincosl.c
@@ -4,7 +4,10 @@
 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
 void sincosl(long double x, long double *sin, long double *cos)
 {
-	sincos(x, (double *)sin, (double *)cos);
+	double sind, cosd;
+	sincos(x, &sind, &cosd);
+	*sin = sind;
+	*cos = cosd;
 }
 #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
 void sincosl(long double x, long double *sin, long double *cos)