aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-04-19 14:21:42 +0200
committerEven Rouault <even.rouault@spatialys.com>2019-04-19 14:21:42 +0200
commit3ff04e06a2ba9d40ead861be0ebdb22af45eaa0d (patch)
tree3f0ed0985b9bdb8754cd835c499fa37af0e46fbe /src
parentfb88946ac55fafd25a021e26c151b492efe5fd4c (diff)
downloadPROJ-3ff04e06a2ba9d40ead861be0ebdb22af45eaa0d.tar.gz
PROJ-3ff04e06a2ba9d40ead861be0ebdb22af45eaa0d.zip
Inverse cart: better deal with x,y,z equal of very close to zero
In that case, for a non-spherical ellipsoid, a phi = 180deg was returned, which caused a division by zero in the foward path of moll.cpp Fixup the latitude to be 0 when that happens. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14348 Credit to OSS Fuzz
Diffstat (limited to 'src')
-rw-r--r--src/conversions/cart.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/conversions/cart.cpp b/src/conversions/cart.cpp
index e6942d65..c1f6f09d 100644
--- a/src/conversions/cart.cpp
+++ b/src/conversions/cart.cpp
@@ -162,6 +162,12 @@ static PJ_LPZ geodetic (PJ_XYZ cart, PJ *P) {
c = cos(theta);
s = sin(theta);
lpz.phi = atan2 (cart.z + P->e2s*P->b*s*s*s, p - P->es*P->a*c*c*c);
+ if( fabs(lpz.phi) > M_HALFPI ) {
+ // this happen on non-sphere ellipsoid when x,y,z is very close to 0
+ // there is no single solution to the cart->geodetic conversion in
+ // that case, so arbitrarily pickup phi = 0.
+ lpz.phi = 0;
+ }
lpz.lam = atan2 (cart.y, cart.x);
N = normal_radius_of_curvature (P->a, P->es, lpz.phi);