aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Knudsen <busstoptaktik@users.noreply.github.com>2017-11-22 09:42:35 +0100
committerGitHub <noreply@github.com>2017-11-22 09:42:35 +0100
commite1630d007ee7614a220221df5a7a417a775d48ad (patch)
treed9a992e2dac7ecd6a943a32cead4aacb931742c1
parent742d8913037464b484c45c40c7d14a216599f834 (diff)
parentd75ca721708dbe8ac55bb3df9ca077848fa5fb63 (diff)
downloadPROJ-e1630d007ee7614a220221df5a7a417a775d48ad.tar.gz
PROJ-e1630d007ee7614a220221df5a7a417a775d48ad.zip
Merge pull request #679 from busstoptaktik/oss_fuzz-4369-to_meter
Avoid div-by-0 in to_meter init
-rw-r--r--src/pj_init.c20
-rw-r--r--test/gie/more_builtins.gie12
2 files changed, 27 insertions, 5 deletions
diff --git a/src/pj_init.c b/src/pj_init.c
index 0cdfcc4d..62dea1f2 100644
--- a/src/pj_init.c
+++ b/src/pj_init.c
@@ -627,12 +627,22 @@ pj_init_ctx(projCtx ctx, int argc, char **argv) {
s = pj_units[i].to_meter;
}
if (s || (s = pj_param(ctx, start, "sto_meter").s)) {
- PIN->to_meter = pj_strtod(s, &s);
- if (*s == '/') /* ratio number */
- PIN->to_meter /= pj_strtod(++s, 0);
- if (PIN->to_meter <= 0.0)
+ double factor;
+ int ratio = 0;
+
+ /* ratio number? */
+ if (*s == '/') {
+ ratio = 1;
+ s++;
+ }
+
+ factor = pj_strtod(s, &s);
+ if ((factor <= 0.0) || (1/factor==0))
return pj_default_destructor (PIN, PJD_ERR_UNIT_FACTOR_LESS_THAN_0);
- PIN->fr_meter = 1. / PIN->to_meter;
+
+ PIN->to_meter = ratio? 1 / factor: factor;
+ PIN->fr_meter = 1 / PIN->to_meter;
+
} else
PIN->to_meter = PIN->fr_meter = 1.;
diff --git a/test/gie/more_builtins.gie b/test/gie/more_builtins.gie
index cf96c77e..8ac8a667 100644
--- a/test/gie/more_builtins.gie
+++ b/test/gie/more_builtins.gie
@@ -273,6 +273,18 @@ expect 12 89.999999999989996 0 0
-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------
+some less used options
+-------------------------------------------------------------------------------
+operation proj=utm ellps=GRS80 zone=32 to_meter=0
+expect failure
+
+operation proj=utm ellps=GRS80 zone=32 to_meter=10
+accept 12 55
+expect 69187.5632 609890.7825
+-------------------------------------------------------------------------------
+
+
-------------------------------------------------------------------------------
run the few gie-builtin tests, which are currently either awkward or impossible