aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-03-20 17:07:21 +0000
committerEven Rouault <even.rouault@spatialys.com>2019-03-20 17:07:21 +0000
commit4448b376be42b5eedc0e7fa86f4551d5d19f7346 (patch)
tree900790004217941f9537511834ac82d78a203e99 /src
parenta3976e657cb3364762fb4704094c0c972dab8f36 (diff)
downloadPROJ-4448b376be42b5eedc0e7fa86f4551d5d19f7346.tar.gz
PROJ-4448b376be42b5eedc0e7fa86f4551d5d19f7346.zip
imw_p: prevent division by zero in inverse path
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13828 Credit to OSS Fuzz
Diffstat (limited to 'src')
-rw-r--r--src/projections/imw_p.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/projections/imw_p.cpp b/src/projections/imw_p.cpp
index 723fcc48..41882df2 100644
--- a/src/projections/imw_p.cpp
+++ b/src/projections/imw_p.cpp
@@ -116,7 +116,12 @@ static PJ_LP e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse */
lp.lam = xy.x / cos(lp.phi);
do {
t = loc_for(lp, P, &yc);
- lp.phi = ((lp.phi - Q->phi_1) * (xy.y - yc) / (t.y - yc)) + Q->phi_1;
+ const double denom = t.y - yc;
+ if( denom == 0 ) {
+ proj_errno_set(P, PJD_ERR_NON_CONVERGENT);
+ return proj_coord_error().lp;
+ }
+ lp.phi = ((lp.phi - Q->phi_1) * (xy.y - yc) / denom) + Q->phi_1;
lp.lam = lp.lam * xy.x / t.x;
i ++;
} while (i < N_MAX_ITER &&
@@ -124,7 +129,8 @@ static PJ_LP e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse */
if( i == N_MAX_ITER )
{
- lp.lam = lp.phi = HUGE_VAL;
+ proj_errno_set(P, PJD_ERR_NON_CONVERGENT);
+ return proj_coord_error().lp;
}
return lp;