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 From 293b4fd9465cdc9384419a84941a1e1e88d7a338 Mon Sep 17 00:00:00 2001 From: Kurt Schwehr Date: Wed, 23 May 2018 09:46:12 -0700 Subject: gie roundtrip: Expand the 3 cases for the args --- docs/source/apps/gie.rst | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/source/apps/gie.rst b/docs/source/apps/gie.rst index b6c1c166..b3d1a06b 100644 --- a/docs/source/apps/gie.rst +++ b/docs/source/apps/gie.rst @@ -207,10 +207,26 @@ gie command language to function. The accepted coordinate is passed to the operation first in it's forward mode, then the output from the forward operation is passed back to the inverse operation. This procedure is done ``n`` times. If the - resulting coordinate is within the set tolerance of the initial coordinate + resulting coordinate is within the set tolerance of the initial coordinate, the test is passed. - Example: + Example with the default 100 iterations and the default tolerance: + + .. code-block:: console + + operation proj=merc + accept 12 55 + roundtrip + + Example with count and default tolerance: + + .. code-block:: console + + operation proj=merc + accept 12 55 + roundtrip 10000 + + Example with count and tolerance: .. code-block:: console -- cgit v1.2.3