diff options
| author | Kristian Evers <kristianevers@gmail.com> | 2017-05-23 21:57:04 +0200 |
|---|---|---|
| committer | Kristian Evers <kristianevers@gmail.com> | 2017-05-23 21:57:04 +0200 |
| commit | fe843d11b4b5f58e09e896848ce4354170bf14bc (patch) | |
| tree | ede1f40b256cdde94055bb724972222107950363 | |
| parent | 28818777f9050ba78d9955839d2763380dcc4612 (diff) | |
| download | PROJ-fe843d11b4b5f58e09e896848ce4354170bf14bc.tar.gz PROJ-fe843d11b4b5f58e09e896848ce4354170bf14bc.zip | |
Avoid zero division in PJ_stere e_forward().
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1797
Credit to OSS-Fuzz.
| -rw-r--r-- | src/PJ_stere.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/PJ_stere.c b/src/PJ_stere.c index c7fb02e3..f338d16d 100644 --- a/src/PJ_stere.c +++ b/src/PJ_stere.c @@ -34,7 +34,7 @@ static double ssfn_ (double phit, double sinphi, double eccen) { static XY e_forward (LP lp, PJ *P) { /* Ellipsoidal, forward */ XY xy = {0.0,0.0}; struct pj_opaque *Q = P->opaque; - double coslam, sinlam, sinX = 0.0, cosX = 0.0, X, A, sinphi; + double coslam, sinlam, sinX = 0.0, cosX = 0.0, X, A = 0.0, sinphi; coslam = cos (lp.lam); sinlam = sin (lp.lam); @@ -52,8 +52,13 @@ static XY e_forward (LP lp, PJ *P) { /* Ellipsoidal, forward */ goto xmul; /* but why not just xy.x = A * cosX; break; ? */ case EQUIT: - A = Q->akm1 / (1. + cosX * coslam); - xy.y = A * sinX; + /* avoid zero division */ + if (1. + cosX * coslam == 0.0) { + xy.y = HUGE_VAL; + } else { + A = Q->akm1 / (1. + cosX * coslam); + xy.y = A * sinX; + } xmul: xy.x = A * cosX; break; |
