[geos-commits] [SCM] GEOS branch master updated. 34918fd50f8cb42c75a5a16c9e6d9f315068d1f8

git at osgeo.org git at osgeo.org
Mon Mar 8 14:52:59 PST 2021


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GEOS".

The branch, master has been updated
       via  34918fd50f8cb42c75a5a16c9e6d9f315068d1f8 (commit)
       via  ca61be30e93ab6f508ce9d6fca7c822297ff74d5 (commit)
      from  e282cbe1e774d22f43c3acfdcd98d820acc32201 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 34918fd50f8cb42c75a5a16c9e6d9f315068d1f8
Merge: e282cbe ca61be3
Author: Paul Ramsey <pramsey at cleverelephant.ca>
Date:   Mon Mar 8 14:52:49 2021 -0800

    Merge branch 'rouault-fix_gdal_3542'


commit ca61be30e93ab6f508ce9d6fca7c822297ff74d5
Author: Even Rouault <even.rouault at spatialys.com>
Date:   Mon Mar 8 16:51:00 2021 +0100

    Fix crash with GEOSPreparedIntersects/Covers on a POINT EMPTY
    
    Fixes use case spotted by https://github.com/OSGeo/gdal/issues/3542#issuecomment-792659437

diff --git a/src/geom/prep/BasicPreparedGeometry.cpp b/src/geom/prep/BasicPreparedGeometry.cpp
index 7d15f1a..78acb8a 100644
--- a/src/geom/prep/BasicPreparedGeometry.cpp
+++ b/src/geom/prep/BasicPreparedGeometry.cpp
@@ -42,7 +42,11 @@ bool
 BasicPreparedGeometry::envelopesIntersect(const geom::Geometry* g) const
 {
     if (g->getGeometryTypeId() == GEOS_POINT) {
-        return baseGeom->getEnvelopeInternal()->intersects(*(g->getCoordinate()));
+        auto pt = g->getCoordinate();
+        if (pt == nullptr) {
+            return false;
+        }
+        return baseGeom->getEnvelopeInternal()->intersects(*pt);
     }
 
     return baseGeom->getEnvelopeInternal()->intersects(g->getEnvelopeInternal());
@@ -52,7 +56,11 @@ bool
 BasicPreparedGeometry::envelopeCovers(const geom::Geometry* g) const
 {
     if (g->getGeometryTypeId() == GEOS_POINT) {
-        return baseGeom->getEnvelopeInternal()->covers(g->getCoordinate());
+        auto pt = g->getCoordinate();
+        if (pt == nullptr) {
+            return false;
+        }
+        return baseGeom->getEnvelopeInternal()->covers(pt);
     }
 
     return baseGeom->getEnvelopeInternal()->covers(g->getEnvelopeInternal());
diff --git a/tests/unit/capi/GEOSPreparedGeometryTest.cpp b/tests/unit/capi/GEOSPreparedGeometryTest.cpp
index fa5f961..a9611c4 100644
--- a/tests/unit/capi/GEOSPreparedGeometryTest.cpp
+++ b/tests/unit/capi/GEOSPreparedGeometryTest.cpp
@@ -370,5 +370,40 @@ void object::test<11>
         ensure_equals(ret, 0);
     }
 }
+
+// Test PreparedIntersects with Point EMPTY
+template<>
+template<>
+void object::test<12>
+()
+{
+    geom1_ = GEOSGeomFromWKT("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))");
+    geom2_ = GEOSGeomFromWKT("POINT EMPTY");
+    prepGeom1_ = GEOSPrepare(geom1_);
+
+    ensure(nullptr != prepGeom1_);
+    ensure(nullptr != geom2_);
+
+    int ret = GEOSPreparedIntersects(prepGeom1_, geom2_);
+    ensure_equals(ret, 0);
+}
+
+// Test PreparedCovers with Point EMPTY
+template<>
+template<>
+void object::test<13>
+()
+{
+    geom1_ = GEOSGeomFromWKT("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))");
+    geom2_ = GEOSGeomFromWKT("POINT EMPTY");
+    prepGeom1_ = GEOSPrepare(geom1_);
+
+    ensure(nullptr != prepGeom1_);
+    ensure(nullptr != geom2_);
+
+    int ret = GEOSPreparedCovers(prepGeom1_, geom2_);
+    ensure_equals(ret, 0);
+}
+
 } // namespace tut
 

-----------------------------------------------------------------------

Summary of changes:
 src/geom/prep/BasicPreparedGeometry.cpp      | 12 ++++++++--
 tests/unit/capi/GEOSPreparedGeometryTest.cpp | 35 ++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 2 deletions(-)


hooks/post-receive
-- 
GEOS


More information about the geos-commits mailing list