From 03c4a33755f6c8bba4b97ea7cfd3536d95305014 Mon Sep 17 00:00:00 2001 From: Kurt Schwehr Date: Tue, 22 May 2018 17:17:47 -0700 Subject: Limit the number of round trips to 1 million and check for underflows Why was fabs applied to ntrips? And why is it parsed as a float? Also add documentation for roundtrip. External rst docs do not match this function. --- src/gie.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/gie.c b/src/gie.c index e0effaa4..d304bd65 100644 --- a/src/gie.c +++ b/src/gie.c @@ -705,6 +705,20 @@ static int roundtrip (const char *args) { /***************************************************************************** Check how far we go from the ACCEPTed point when doing successive back/forward transformation pairs. + +Without args, roundtrip defaults to 100 iterations: + + roundtrip + +With one arg, roundtrip will default to a tolerance of T.tolerance: + + roundtrip ntrips + +With two args: + + roundtrip ntrips tolerance + +Always returns 0. ******************************************************************************/ int ntrips; double d, r, ans; @@ -719,7 +733,17 @@ back/forward transformation pairs. } ans = proj_strtod (args, &endp); - ntrips = (int) (endp==args? 100: fabs(ans)); + if (endp==args) { + /* Default to 100 iterations if not args. */ + ntrips = 100; + } else { + if (ans < 1.0 || ans > 1000000.0) { + errmsg (2, "Invalid number of roundtrips: %lf\n", ans); + return another_failing_roundtrip (); + } + ntrips = (int)ans; + } + d = strtod_scaled (endp, 1); d = d==HUGE_VAL? T.tolerance: d; -- cgit v1.2.3