From 3a68912a6b556dccf22d8e8b329404821d238e50 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 17 Sep 2019 21:01:04 +0200 Subject: pj_Convert_Geocentric_To_Geodetic(): avoid division by zero on weird input coordinates and ellipsoid values. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14766 --- src/geocent.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/geocent.cpp') diff --git a/src/geocent.cpp b/src/geocent.cpp index c023bdd3..dd14af35 100644 --- a/src/geocent.cpp +++ b/src/geocent.cpp @@ -399,7 +399,15 @@ void pj_Convert_Geocentric_To_Geodetic (GeocentricInfo *gi, */ CT = Z/RR; ST = P/RR; - RX = 1.0/sqrt(1.0-gi->Geocent_e2*(2.0-gi->Geocent_e2)*ST*ST); + const double denominator = 1.0-gi->Geocent_e2*(2.0-gi->Geocent_e2)*ST*ST; + if( denominator == 0 ) + { + *Latitude = HUGE_VAL; + *Longitude = HUGE_VAL; + *Height = HUGE_VAL; + return; + } + RX = 1.0/sqrt(denominator); CPHI0 = ST*(1.0-gi->Geocent_e2)*RX; SPHI0 = CT*RX; iter = 0; -- cgit v1.2.3 From a49d5a5daddd23a3206e00ca17e58c61076474e9 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 17 Sep 2019 21:10:56 +0200 Subject: pj_Convert_Geocentric_To_Geodetic(): avoid division by zero on weird input coordinates and ellipsoid values. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=15148& --- src/geocent.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'src/geocent.cpp') diff --git a/src/geocent.cpp b/src/geocent.cpp index dd14af35..cbcc1df5 100644 --- a/src/geocent.cpp +++ b/src/geocent.cpp @@ -399,15 +399,17 @@ void pj_Convert_Geocentric_To_Geodetic (GeocentricInfo *gi, */ CT = Z/RR; ST = P/RR; - const double denominator = 1.0-gi->Geocent_e2*(2.0-gi->Geocent_e2)*ST*ST; - if( denominator == 0 ) { - *Latitude = HUGE_VAL; - *Longitude = HUGE_VAL; - *Height = HUGE_VAL; - return; + const double denominator = 1.0-gi->Geocent_e2*(2.0-gi->Geocent_e2)*ST*ST; + if( denominator == 0 ) + { + *Latitude = HUGE_VAL; + *Longitude = HUGE_VAL; + *Height = HUGE_VAL; + return; + } + RX = 1.0/sqrt(denominator); } - RX = 1.0/sqrt(denominator); CPHI0 = ST*(1.0-gi->Geocent_e2)*RX; SPHI0 = CT*RX; iter = 0; @@ -428,7 +430,17 @@ void pj_Convert_Geocentric_To_Geodetic (GeocentricInfo *gi, return; } RK = gi->Geocent_e2*RN/(RN+*Height); - RX = 1.0/sqrt(1.0-RK*(2.0-RK)*ST*ST); + { + const double denominator = 1.0-RK*(2.0-RK)*ST*ST; + if( denominator == 0 ) + { + *Latitude = HUGE_VAL; + *Longitude = HUGE_VAL; + *Height = HUGE_VAL; + return; + } + RX = 1.0/sqrt(denominator); + } CPHI = ST*(1.0-RK)*RX; SPHI = CT*RX; SDPHI = SPHI*CPHI0-CPHI*SPHI0; -- cgit v1.2.3