diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2017-06-08 14:54:29 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2017-06-08 14:54:29 +0200 |
| commit | 00ac8f3a9c129a7189df6bf2a6606ffbfd5c8ea3 (patch) | |
| tree | 002ca97ae127d69063cfe0bb5dd16c42369a2f35 | |
| parent | fa52fe3cef2cb435db08f09a084b8b9611e4392a (diff) | |
| download | PROJ-00ac8f3a9c129a7189df6bf2a6606ffbfd5c8ea3.tar.gz PROJ-00ac8f3a9c129a7189df6bf2a6606ffbfd5c8ea3.zip | |
PJ_comill.c: avoid infinite loop in inverse method. Credit to OSS Fuzz
| -rw-r--r-- | src/PJ_comill.c | 8 | ||||
| -rw-r--r-- | src/pj_strerrno.c | 1 | ||||
| -rw-r--r-- | src/projects.h | 1 |
3 files changed, 8 insertions, 2 deletions
diff --git a/src/PJ_comill.c b/src/PJ_comill.c index c492dc95..1a4508b1 100644 --- a/src/PJ_comill.c +++ b/src/PJ_comill.c @@ -19,7 +19,8 @@ PROJ_HEAD(comill, "Compact Miller") "\n\tCyl., Sph."; #define C3 (5 * K3) #define EPS 1e-11 #define MAX_Y (0.6000207669862655 * M_PI) - +/* Not sure at all of the appropriate number for MAX_ITER... */ +#define MAX_ITER 100 static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */ XY xy = {0.0,0.0}; @@ -37,6 +38,7 @@ static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */ static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */ LP lp = {0.0,0.0}; double yc, tol, y2, f, fder; + int i; (void) P; /* silence unused parameter warnings */ @@ -49,7 +51,7 @@ static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */ /* latitude */ yc = xy.y; - for (;;) { /* Newton-Raphson */ + for (i = MAX_ITER; i ; --i) { /* Newton-Raphson */ y2 = yc * yc; f = (yc * (K1 + y2 * (K2 + K3 * y2))) - xy.y; fder = C1 + y2 * (C2 + C3 * y2); @@ -58,6 +60,8 @@ static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */ break; } } + if( i == 0 ) + pj_ctx_set_errno( P->ctx, PJD_ERR_NON_CONVERGENT ); lp.phi = yc; /* longitude */ diff --git a/src/pj_strerrno.c b/src/pj_strerrno.c index 2bcdc356..5e8325c9 100644 --- a/src/pj_strerrno.c +++ b/src/pj_strerrno.c @@ -58,6 +58,7 @@ pj_err_list[] = { "malformed pipeline", /* -50 */ "unit conversion factor must be > 0", /* -51 */ "invalid scale", /* -52 */ + "non-convergent computation", /* -53 */ }; char *pj_strerrno(int err) { diff --git a/src/projects.h b/src/projects.h index 0e9f1b59..c1bf1b3a 100644 --- a/src/projects.h +++ b/src/projects.h @@ -459,6 +459,7 @@ struct FACTORS { #define PJD_ERR_GRID_AREA -48 #define PJD_ERR_CATALOG -49 #define PJD_ERR_INVALID_SCALE -52 +#define PJD_ERR_NON_CONVERGENT -53 struct projFileAPI_t; |
