Skip to content
Permalink
Browse files
Guard against some crashes in geometry
(cherry picked from commit cc1a34f)
  • Loading branch information
nyalldawson authored and jef-n committed Jul 19, 2015
1 parent d03793c commit f025a774925d4b2235509978d91cd1e69231fd8d
Showing with 21 additions and 3 deletions.
  1. +1 −1 src/core/geometry/qgscircularstringv2.cpp
  2. +2 −2 src/core/geometry/qgslinestringv2.cpp
  3. +18 −0 tests/src/python/test_qgsgeometry.py
@@ -695,7 +695,7 @@ bool QgsCircularStringV2::insertVertex( const QgsVertexId& position, const QgsPo

bool QgsCircularStringV2::moveVertex( const QgsVertexId& position, const QgsPointV2& newPos )
{
if ( position.vertex < 0 || position.vertex > mX.size() )
if ( position.vertex < 0 || position.vertex >= mX.size() )
{
return false;
}
@@ -358,7 +358,7 @@ bool QgsLineStringV2::insertVertex( const QgsVertexId& position, const QgsPointV

bool QgsLineStringV2::moveVertex( const QgsVertexId& position, const QgsPointV2& newPos )
{
if ( position.vertex < 0 || position.vertex > mCoords.size() )
if ( position.vertex < 0 || position.vertex >= mCoords.size() )
{
return false;
}
@@ -378,7 +378,7 @@ bool QgsLineStringV2::moveVertex( const QgsVertexId& position, const QgsPointV2&

bool QgsLineStringV2::deleteVertex( const QgsVertexId& position )
{
if ( position.vertex > ( mCoords.size() - 1 ) || position.vertex < 0 )
if ( position.vertex >= mCoords.size() || position.vertex < 0 )
{
return false;
}
@@ -751,6 +751,12 @@ def testMultipoint(self):

def testMoveVertex(self):
multipoint = QgsGeometry.fromWkt( "MultiPoint ((5 0),(0 0),(0 4),(5 4),(5 1),(1 1),(1 3),(4 3),(4 2),(2 2))" )

#try moving invalid vertices
assert not multipoint.moveVertex( 9, 9, -1 ), "move vertex succeeded when it should have failed"
assert not multipoint.moveVertex( 9, 9, 10 ), "move vertex succeeded when it should have failed"
assert not multipoint.moveVertex( 9, 9, 11 ), "move vertex succeeded when it should have failed"

for i in range(0,10):
assert multipoint.moveVertex( i+1, -1-i, i ), "move vertex %d failed" % i
expwkt = "MultiPoint ((1 -1),(2 -2),(3 -3),(4 -4),(5 -5),(6 -6),(7 -7),(8 -8),(9 -9),(10 -10))"
@@ -767,6 +773,12 @@ def testMoveVertex(self):
# |
# 1-+-+-+-+-0 !
polyline = QgsGeometry.fromWkt( "LineString (5 0, 0 0, 0 4, 5 4, 5 1, 1 1, 1 3, 4 3, 4 2, 2 2)" )

#try moving invalid vertices
assert not polyline.moveVertex( 9, 9, -1 ), "move vertex succeeded when it should have failed"
assert not polyline.moveVertex( 9, 9, 10 ), "move vertex succeeded when it should have failed"
assert not polyline.moveVertex( 9, 9, 11 ), "move vertex succeeded when it should have failed"

assert polyline.moveVertex( 5.5, 4.5, 3 ), "move vertex failed"
expwkt = "LineString (5 0, 0 0, 0 4, 5.5 4.5, 5 1, 1 1, 1 3, 4 3, 4 2, 2 2)"
wkt = polyline.exportToWkt()
@@ -781,6 +793,7 @@ def testMoveVertex(self):

assert not polygon.moveVertex( 3, 4, -10 ), "move vertex unexpectedly succeeded"
assert not polygon.moveVertex( 3, 4, 7 ), "move vertex unexpectedly succeeded"
assert not polygon.moveVertex( 3, 4, 8 ), "move vertex unexpectedly succeeded"

assert polygon.moveVertex( 1, 2, 0 ), "move vertex failed"
expwkt = "Polygon ((1 2, 1 0, 1 1, 2 1, 2 2, 0 2, 1 2))"
@@ -803,6 +816,11 @@ def testMoveVertex(self):
# | | | |
# 0-1 7-8
polygon = QgsGeometry.fromWkt( "MultiPolygon (((0 0, 1 0, 1 1, 2 1, 2 2, 0 2, 0 0)),((4 0, 5 0, 5 2, 3 2, 3 1, 4 1, 4 0)))" )

assert not polygon.moveVertex( 3, 4, -10 ), "move vertex unexpectedly succeeded"
assert not polygon.moveVertex( 3, 4, 14 ), "move vertex unexpectedly succeeded"
assert not polygon.moveVertex( 3, 4, 15 ), "move vertex unexpectedly succeeded"

assert polygon.moveVertex( 6, 2, 9 ), "move vertex failed"
expwkt = "MultiPolygon (((0 0, 1 0, 1 1, 2 1, 2 2, 0 2, 0 0)),((4 0, 5 0, 6 2, 3 2, 3 1, 4 1, 4 0)))"
wkt = polygon.exportToWkt()

0 comments on commit f025a77

Please sign in to comment.