aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-02-03 15:16:01 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-02-03 15:16:01 +0100
commite121dc35abafd9a2eda01b05aa5fa13b13e6196e (patch)
tree7f49c0ccf0c9792da32cf1fdbd6868bd6f6aded3
parent24c1272cf4397614fb7ea5502bba9258e6a8f972 (diff)
downloadPROJ-e121dc35abafd9a2eda01b05aa5fa13b13e6196e.tar.gz
PROJ-e121dc35abafd9a2eda01b05aa5fa13b13e6196e.zip
Avoid division by zero in Ellipsoid::computeSemiMinorAxis(). Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12867. Credit to OSS Fuzz. master only
-rw-r--r--src/iso19111/datum.cpp10
-rw-r--r--test/unit/test_datum.cpp12
2 files changed, 19 insertions, 3 deletions
diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp
index 4df1b319..66717f70 100644
--- a/src/iso19111/datum.cpp
+++ b/src/iso19111/datum.cpp
@@ -646,7 +646,8 @@ EllipsoidNNPtr Ellipsoid::createSphere(const util::PropertyMap &properties,
* @param properties See \ref general_properties.
* At minimum the name should be defined.
* @param semiMajorAxisIn the semi-major axis.
- * @param invFlattening the inverse/reverse flattening.
+ * @param invFlattening the inverse/reverse flattening. If set to 0, this will
+ * be considered as a sphere.
* @param celestialBody Name of the celestial body on which the ellipsoid refers
* to.
* @return new Ellipsoid.
@@ -654,8 +655,11 @@ EllipsoidNNPtr Ellipsoid::createSphere(const util::PropertyMap &properties,
EllipsoidNNPtr Ellipsoid::createFlattenedSphere(
const util::PropertyMap &properties, const common::Length &semiMajorAxisIn,
const common::Scale &invFlattening, const std::string &celestialBody) {
- auto ellipsoid(Ellipsoid::nn_make_shared<Ellipsoid>(
- semiMajorAxisIn, invFlattening, celestialBody));
+ auto ellipsoid(invFlattening.value() == 0
+ ? Ellipsoid::nn_make_shared<Ellipsoid>(semiMajorAxisIn,
+ celestialBody)
+ : Ellipsoid::nn_make_shared<Ellipsoid>(
+ semiMajorAxisIn, invFlattening, celestialBody));
ellipsoid->setProperties(properties);
return ellipsoid;
}
diff --git a/test/unit/test_datum.cpp b/test/unit/test_datum.cpp
index 18cf244a..c6ccf5cf 100644
--- a/test/unit/test_datum.cpp
+++ b/test/unit/test_datum.cpp
@@ -127,6 +127,18 @@ TEST(datum, ellipsoid_from_inverse_flattening) {
// ---------------------------------------------------------------------------
+TEST(datum, ellipsoid_from_null_inverse_flattening) {
+
+ auto ellipsoid = Ellipsoid::createFlattenedSphere(
+ PropertyMap(), Length(6378137), Scale(0));
+ EXPECT_FALSE(ellipsoid->inverseFlattening().has_value());
+ EXPECT_FALSE(ellipsoid->semiMinorAxis().has_value());
+ EXPECT_FALSE(ellipsoid->semiMedianAxis().has_value());
+ EXPECT_TRUE(ellipsoid->isSphere());
+}
+
+// ---------------------------------------------------------------------------
+
TEST(datum, ellipsoid_from_semi_minor_axis) {
auto ellipsoid = Ellipsoid::createTwoAxis(PropertyMap(), Length(6378137),