aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2017-06-08 15:45:35 +0200
committerEven Rouault <even.rouault@spatialys.com>2017-06-08 15:45:35 +0200
commit3628fb90c942aca31d238e9ad5912325452b91ad (patch)
tree86e3e2e81d2e91114e1637da32448313522aac91 /src
parentccdac1ef439711969788e20a682dcb1b9ff14923 (diff)
downloadPROJ-3628fb90c942aca31d238e9ad5912325452b91ad.tar.gz
PROJ-3628fb90c942aca31d238e9ad5912325452b91ad.zip
PJ_krovak.c: avoid infinite loop in inverse method. Credit to OSS Fuzz
Diffstat (limited to 'src')
-rw-r--r--src/PJ_krovak.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/PJ_krovak.c b/src/PJ_krovak.c
index c469346f..bee66b07 100644
--- a/src/PJ_krovak.c
+++ b/src/PJ_krovak.c
@@ -86,6 +86,8 @@ PROJ_HEAD(krovak, "Krovak") "\n\tPCyl., Ellps.";
#define S90 1.570796326794896 /* 90 deg */
#define UQ 1.04216856380474 /* DU(2, 59, 42, 42.69689) */
#define S0 1.37008346281555 /* Latitude of pseudo standard parallel 78deg 30'00" N */
+/* Not sure at all of the appropriate number for MAX_ITER... */
+#define MAX_ITER 100
struct pj_opaque {
double alpha;
@@ -129,7 +131,7 @@ static LP e_inverse (XY xy, PJ *P) { /* Ellipsoidal, inverse */
LP lp = {0.0,0.0};
double u, deltav, s, d, eps, rho, fi1, xy0;
- int ok;
+ int i;
xy0 = xy.x;
xy.x = xy.y;
@@ -152,16 +154,18 @@ static LP e_inverse (XY xy, PJ *P) { /* Ellipsoidal, inverse */
/* ITERATION FOR lp.phi */
fi1 = u;
- ok = 0;
- do {
+ for (i = MAX_ITER; i ; --i) {
lp.phi = 2. * ( atan( pow( Q->k, -1. / Q->alpha) *
pow( tan(u / 2. + S45) , 1. / Q->alpha) *
pow( (1. + P->e * sin(fi1)) / (1. - P->e * sin(fi1)) , P->e / 2.)
) - S45);
- if (fabs(fi1 - lp.phi) < EPS) ok=1;
+ if (fabs(fi1 - lp.phi) < EPS)
+ break;
fi1 = lp.phi;
- } while (ok==0);
+ }
+ if( i == 0 )
+ pj_ctx_set_errno( P->ctx, PJD_ERR_NON_CONVERGENT );
lp.lam -= P->lam0;