aboutsummaryrefslogtreecommitdiff
path: root/src/projections/lagrng.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-05-02 18:11:44 +0200
committerEven Rouault <even.rouault@spatialys.com>2019-05-02 18:11:44 +0200
commitf98f6533cda8fe85fa7507ba97a4eb098ea32cba (patch)
tree8398e2a552b994ecff881ea96eef7f1dc3395da8 /src/projections/lagrng.cpp
parent829df0548894e59a62b08a8108a3e27865171faa (diff)
downloadPROJ-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.cpp14
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.;