diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-05-02 18:11:44 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-05-02 18:11:44 +0200 |
| commit | f98f6533cda8fe85fa7507ba97a4eb098ea32cba (patch) | |
| tree | 8398e2a552b994ecff881ea96eef7f1dc3395da8 /src/projections/lagrng.cpp | |
| parent | 829df0548894e59a62b08a8108a3e27865171faa (diff) | |
| download | PROJ-f98f6533cda8fe85fa7507ba97a4eb098ea32cba.tar.gz PROJ-f98f6533cda8fe85fa7507ba97a4eb098ea32cba.zip | |
lagrng: avoid division by zero when latitude is very close to 90
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14477
Credit to OSS Fuzz
Diffstat (limited to 'src/projections/lagrng.cpp')
| -rw-r--r-- | src/projections/lagrng.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/projections/lagrng.cpp b/src/projections/lagrng.cpp index ac7a37a4..d37a00e6 100644 --- a/src/projections/lagrng.cpp +++ b/src/projections/lagrng.cpp @@ -26,12 +26,12 @@ static PJ_XY lagrng_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwa struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque); double v, c; - if (fabs(fabs(lp.phi) - M_HALFPI) < TOL) { + const double sin_phi = sin(lp.phi); + if (fabs(fabs(sin_phi) - 1) < TOL) { xy.x = 0; xy.y = lp.phi < 0 ? -2. : 2.; } else { - lp.phi = sin(lp.phi); - v = Q->a1 * pow((1. + lp.phi)/(1. - lp.phi), Q->hrw); + v = Q->a1 * pow((1. + sin_phi)/(1. - sin_phi), Q->hrw); lp.lam *= Q->rw; c = 0.5 * (v + 1./v) + cos(lp.lam); if (c < TOL) { @@ -70,7 +70,7 @@ static PJ_LP lagrng_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver PJ *PROJECTION(lagrng) { - double phi1; + double sin_phi1; struct pj_opaque *Q = static_cast<struct pj_opaque*>(pj_calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) return pj_default_destructor (P, ENOMEM); @@ -85,11 +85,11 @@ PJ *PROJECTION(lagrng) { Q->hw = 0.5 * Q->w; Q->rw = 1. / Q->w; Q->hrw = 0.5 * Q->rw; - phi1 = sin(pj_param(P->ctx, P->params, "rlat_1").f); - if (fabs(fabs(phi1) - 1.) < TOL) + sin_phi1 = sin(pj_param(P->ctx, P->params, "rlat_1").f); + if (fabs(fabs(sin_phi1) - 1.) < TOL) return pj_default_destructor(P, PJD_ERR_LAT_LARGER_THAN_90); - Q->a1 = pow((1. - phi1)/(1. + phi1), Q->hrw); + Q->a1 = pow((1. - sin_phi1)/(1. + sin_phi1), Q->hrw); Q->a2 = Q->a1 * Q->a1; P->es = 0.; |
