From db29f2ecf6f49250079b962ad788b93fbc497fa3 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 15 Mar 2019 00:10:02 +0100 Subject: Molodensky: avoid division by zero Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13069 Credit to OSS Fuzz --- src/transformations/molodensky.cpp | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'src/transformations/molodensky.cpp') diff --git a/src/transformations/molodensky.cpp b/src/transformations/molodensky.cpp index c389fd32..373b1095 100644 --- a/src/transformations/molodensky.cpp +++ b/src/transformations/molodensky.cpp @@ -146,10 +146,20 @@ static PJ_LPZ calc_standard_params(PJ_LPZ lpz, PJ *P) { dphi = (-dx*sphi*clam) - (dy*sphi*slam) + (dz*cphi) + ((nu * P->es * sphi * cphi * da) / a) + (sphi*cphi * ( rho/(1-f) + nu*(1-f))*df); - dphi /= (rho + lpz.z); + const double dphi_denom = rho + lpz.z; + if( dphi_denom == 0.0 ) { + lpz.lam = HUGE_VAL; + return lpz; + } + dphi /= dphi_denom; /* delta lambda */ - dlam = (-dx*slam + dy*clam) / ((nu+lpz.z)*cphi); + const double dlam_denom = (nu+lpz.z)*cphi; + if( dlam_denom == 0.0 ) { + lpz.lam = HUGE_VAL; + return lpz; + } + dlam = (-dx*slam + dy*clam) / dlam_denom; /* delta h */ dh = dx*cphi*clam + dy*cphi*slam + dz*sphi - (a/nu)*da + nu*(1-f)*sphi*sphi*df; @@ -183,7 +193,12 @@ static PJ_LPZ calc_abridged_params(PJ_LPZ lpz, PJ *P) { /* delta lambda */ dlam = -dx*slam + dy*clam; - dlam /= RN(P->a, P->e2s, lpz.phi)*cphi; + const double dlam_denom = RN(P->a, P->e2s, lpz.phi)*cphi; + if( dlam_denom == 0.0 ) { + lpz.lam = HUGE_VAL; + return lpz; + } + dlam /= dlam_denom; /* delta h */ dh = dx*cphi*clam + dy*cphi*slam + dz*sphi - da + adffda*sphi*sphi; @@ -230,6 +245,10 @@ static PJ_XYZ forward_3d(PJ_LPZ lpz, PJ *P) { } else { lpz = calc_standard_params(lpz, P); } + if( lpz.lam == HUGE_VAL ) { + proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + return proj_coord_error().xyz; + } /* offset coordinate */ point.lpz.phi += lpz.phi; @@ -258,6 +277,11 @@ static PJ_LPZ reverse_3d(PJ_XYZ xyz, PJ *P) { else lpz = calc_standard_params(point.lpz, P); + if( lpz.lam == HUGE_VAL ) { + proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + return proj_coord_error().lpz; + } + /* offset coordinate */ point.lpz.phi -= lpz.phi; point.lpz.lam -= lpz.lam; -- cgit v1.2.3 From 644a592cc866ae2871eb82fdd428182dab47fab2 Mon Sep 17 00:00:00 2001 From: Kristian Evers Date: Sat, 16 Mar 2019 09:53:56 +0100 Subject: Use 1st eccentricity instead of 2nd eccentricity By mistake the second eccentricity was used in a few places in the Molodensky transform. According to the literature the first eccentricity should always be used in the eccentricity. This only affects the output slightly. Reported test coordinates differed by less than a millimeter. Fixes #1321 --- src/transformations/molodensky.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/transformations/molodensky.cpp') diff --git a/src/transformations/molodensky.cpp b/src/transformations/molodensky.cpp index 373b1095..289c321e 100644 --- a/src/transformations/molodensky.cpp +++ b/src/transformations/molodensky.cpp @@ -140,7 +140,7 @@ static PJ_LPZ calc_standard_params(PJ_LPZ lpz, PJ *P) { /* ellipsoid radii of curvature */ double rho = RM(a, P->es, lpz.phi); - double nu = RN(a, P->e2s, lpz.phi); + double nu = RN(a, P->es, lpz.phi); /* delta phi */ dphi = (-dx*sphi*clam) - (dy*sphi*slam) + (dz*cphi) @@ -193,7 +193,7 @@ static PJ_LPZ calc_abridged_params(PJ_LPZ lpz, PJ *P) { /* delta lambda */ dlam = -dx*slam + dy*clam; - const double dlam_denom = RN(P->a, P->e2s, lpz.phi)*cphi; + const double dlam_denom = RN(P->a, P->es, lpz.phi)*cphi; if( dlam_denom == 0.0 ) { lpz.lam = HUGE_VAL; return lpz; -- cgit v1.2.3 From 095d2204f8bb05d172936aebbb1e9e44852c049f Mon Sep 17 00:00:00 2001 From: Chris Mayo Date: Fri, 29 Mar 2019 19:17:37 +0000 Subject: Remove duplicate instances of #include "proj_internal.h" Introduced by "Merge projects.h into proj_internal.h" 8ab6f683. --- src/transformations/molodensky.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/transformations/molodensky.cpp') diff --git a/src/transformations/molodensky.cpp b/src/transformations/molodensky.cpp index 289c321e..7d17f64c 100644 --- a/src/transformations/molodensky.cpp +++ b/src/transformations/molodensky.cpp @@ -49,7 +49,6 @@ #include "proj.h" #include "proj_internal.h" -#include "proj_internal.h" PROJ_HEAD(molodensky, "Molodensky transform"); -- cgit v1.2.3