aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-08-10 10:00:41 +0200
committerEven Rouault <even.rouault@spatialys.com>2021-08-10 10:04:50 +0200
commit1e6ef36db92406f96fe9cc3fa7f75db1cba7254b (patch)
tree494587cc6f8a08a26fe32152df3ff64e64350469
parente41092a9392ef76967e2c45f5c015cb6e5353b64 (diff)
downloadPROJ-1e6ef36db92406f96fe9cc3fa7f75db1cba7254b.tar.gz
PROJ-1e6ef36db92406f96fe9cc3fa7f75db1cba7254b.zip
Conversion::createUTM(): avoid integer overflow. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=36751
-rwxr-xr-xscripts/create_c_api_projections.py9
-rw-r--r--src/iso19111/operation/conversion.cpp3
-rw-r--r--test/unit/test_c_api.cpp9
3 files changed, 17 insertions, 4 deletions
diff --git a/scripts/create_c_api_projections.py b/scripts/create_c_api_projections.py
index 1682b160..323b54ed 100755
--- a/scripts/create_c_api_projections.py
+++ b/scripts/create_c_api_projections.py
@@ -167,8 +167,11 @@ for sectiondef in compounddef.iter('sectiondef'):
test_cppfile.write("{\n")
test_cppfile.write(" auto projCRS = proj_create_conversion_" + c_shortName + "(\n")
test_cppfile.write(" m_ctxt")
- for param in params:
- test_cppfile.write(", 0")
+ if c_shortName == 'utm':
+ test_cppfile.write(", 1")
+ else:
+ for param in params:
+ test_cppfile.write(", 0")
if has_angle:
test_cppfile.write(", \"Degree\", 0.0174532925199433")
if has_linear:
@@ -184,4 +187,4 @@ cppfile.write("/* END: Generated by scripts/create_c_api_projections.py*/\n")
test_cppfile.write("/* END: Generated by scripts/create_c_api_projections.py*/\n")
-print('projections.h and .cpp, and test_projections.cpp have been generated. Manually merge them now') \ No newline at end of file
+print('projections.h and .cpp, and test_projections.cpp have been generated. Manually merge them now')
diff --git a/src/iso19111/operation/conversion.cpp b/src/iso19111/operation/conversion.cpp
index e2e77562..e884db3c 100644
--- a/src/iso19111/operation/conversion.cpp
+++ b/src/iso19111/operation/conversion.cpp
@@ -331,6 +331,9 @@ Conversion::create(const util::PropertyMap &properties,
*/
ConversionNNPtr Conversion::createUTM(const util::PropertyMap &properties,
int zone, bool north) {
+ if (zone < 1 || zone > 60) {
+ throw InvalidOperation("Invalid zone number");
+ }
return create(
getUTMConversionProperty(properties, zone, north),
EPSG_CODE_METHOD_TRANSVERSE_MERCATOR,
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index 34f32c19..2a82af64 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -2373,10 +2373,17 @@ TEST_F(CApi, check_coord_op_obj_can_be_used_with_proj_trans) {
// ---------------------------------------------------------------------------
TEST_F(CApi, proj_create_projections) {
+ {
+ constexpr int invalid_zone_number = 0;
+ auto projCRS =
+ proj_create_conversion_utm(m_ctxt, invalid_zone_number, 0);
+ ObjectKeeper keeper_projCRS(projCRS);
+ ASSERT_EQ(projCRS, nullptr);
+ }
/* BEGIN: Generated by scripts/create_c_api_projections.py*/
{
- auto projCRS = proj_create_conversion_utm(m_ctxt, 0, 0);
+ auto projCRS = proj_create_conversion_utm(m_ctxt, 1, 0);
ObjectKeeper keeper_projCRS(projCRS);
ASSERT_NE(projCRS, nullptr);
}