diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-02-03 14:48:17 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-02-03 14:48:17 +0100 |
| commit | 24c1272cf4397614fb7ea5502bba9258e6a8f972 (patch) | |
| tree | d6d3579c439869fb0740dec37844e1cd34c84e56 /src/iso19111/coordinateoperation.cpp | |
| parent | b30ed5cba50688cea9ac2af90855177f84efea5a (diff) | |
| download | PROJ-24c1272cf4397614fb7ea5502bba9258e6a8f972.tar.gz PROJ-24c1272cf4397614fb7ea5502bba9258e6a8f972.zip | |
WKT1 export: avoid division by zero. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12854. Credit to OSS Fuzz
Diffstat (limited to 'src/iso19111/coordinateoperation.cpp')
| -rw-r--r-- | src/iso19111/coordinateoperation.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp index 6f9b6283..8a10bc5a 100644 --- a/src/iso19111/coordinateoperation.cpp +++ b/src/iso19111/coordinateoperation.cpp @@ -2147,11 +2147,19 @@ void ParameterValue::_exportToWKT(io::WKTFormatter *formatter) const { // registered linear / angular unit. const auto &unitType = unit.type(); if (unitType == common::UnitOfMeasure::Type::LINEAR) { - formatter->add( - l_value.convertToUnit(*(formatter->axisLinearUnit()))); + const auto &targetUnit = *(formatter->axisLinearUnit()); + if (targetUnit.conversionToSI() == 0.0) { + throw io::FormattingException( + "cannot convert value to target linear unit"); + } + formatter->add(l_value.convertToUnit(targetUnit)); } else if (unitType == common::UnitOfMeasure::Type::ANGULAR) { - formatter->add( - l_value.convertToUnit(*(formatter->axisAngularUnit()))); + const auto &targetUnit = *(formatter->axisAngularUnit()); + if (targetUnit.conversionToSI() == 0.0) { + throw io::FormattingException( + "cannot convert value to target angular unit"); + } + formatter->add(l_value.convertToUnit(targetUnit)); } else { formatter->add(l_value.getSIValue()); } |
