aboutsummaryrefslogtreecommitdiff
path: root/src/pj_transform.c
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2017-05-23 19:32:41 +0200
committerEven Rouault <even.rouault@spatialys.com>2017-05-23 19:33:12 +0200
commit9ebed249a6c8957b345396f6085090f7d2cd0e47 (patch)
treed6a327f6807d4349d0ba317b52ef4c9cbf96d2a6 /src/pj_transform.c
parentb4fade26b674c3f50b2b219cda67448dad1a5885 (diff)
downloadPROJ-9ebed249a6c8957b345396f6085090f7d2cd0e47.tar.gz
PROJ-9ebed249a6c8957b345396f6085090f7d2cd0e47.zip
Avoid potentially very long loop when normalizing longitudes around long_wrap_center
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1809 Credit to OSS Fuzz
Diffstat (limited to 'src/pj_transform.c')
-rw-r--r--src/pj_transform.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/pj_transform.c b/src/pj_transform.c
index 6e48948d..212d8842 100644
--- a/src/pj_transform.c
+++ b/src/pj_transform.c
@@ -422,13 +422,17 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset,
{
for( i = 0; i < point_count; i++ )
{
- if( x[point_offset*i] == HUGE_VAL )
+ double val = x[point_offset*i];
+ if( val == HUGE_VAL )
continue;
- while( x[point_offset*i] < dstdefn->long_wrap_center - M_PI )
- x[point_offset*i] += M_TWOPI;
- while( x[point_offset*i] > dstdefn->long_wrap_center + M_PI )
- x[point_offset*i] -= M_TWOPI;
+ /* Get fast in ] -2 PI, 2 PI [ range */
+ val = fmod(val, M_TWOPI);
+ while( val < dstdefn->long_wrap_center - M_PI )
+ val += M_TWOPI;
+ while( val > dstdefn->long_wrap_center + M_PI )
+ val -= M_TWOPI;
+ x[point_offset*i] = val;
}
}