Fixed #21662 -- Kept parent reference in prepared geometry

Thanks Robert Scott for the report.
This commit is contained in:
Claude Paroz 2013-12-24 15:19:25 +01:00
parent 1716b7ce5a
commit 542198c1d0
2 changed files with 8 additions and 0 deletions

View File

@ -12,6 +12,10 @@ class PreparedGeometry(GEOSBase):
ptr_type = capi.PREPGEOM_PTR ptr_type = capi.PREPGEOM_PTR
def __init__(self, geom): def __init__(self, geom):
# Keeping a reference to the original geometry object to prevent it
# from being garbage collected which could then crash the prepared one
# See #21662
self._base_geom = geom
if not isinstance(geom, GEOSGeometry): if not isinstance(geom, GEOSGeometry):
raise TypeError raise TypeError
self.ptr = capi.geos_prepare(geom.ptr) self.ptr = capi.geos_prepare(geom.ptr)

View File

@ -1046,6 +1046,10 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
self.assertEqual(mpoly.intersects(pnt), prep.intersects(pnt)) self.assertEqual(mpoly.intersects(pnt), prep.intersects(pnt))
self.assertEqual(c, prep.covers(pnt)) self.assertEqual(c, prep.covers(pnt))
# Original geometry deletion should not crash the prepared one (#21662)
del mpoly
self.assertTrue(prep.covers(Point(5, 5)))
def test_line_merge(self): def test_line_merge(self):
"Testing line merge support" "Testing line merge support"
ref_geoms = (fromstr('LINESTRING(1 1, 1 1, 3 3)'), ref_geoms = (fromstr('LINESTRING(1 1, 1 1, 3 3)'),