@@ -128,11 +128,17 @@ QgsConstWkbPtr QgsSymbolV2::_getLineString( QPolygonF& pts, QgsRenderContext& co
128
128
}
129
129
else
130
130
{
131
- pts.resize ( nPoints );
132
-
133
131
int skipZM = ( QgsWKBTypes::coordDimensions ( wkbType ) - 2 ) * sizeof ( double );
134
132
Q_ASSERT ( skipZM >= 0 );
135
133
134
+ if ( static_cast <int >( nPoints * ( 2 * sizeof ( double ) + skipZM ) ) > wkbPtr.remaining () )
135
+ {
136
+ QgsDebugMsg ( QString ( " %1 points exceed wkb length (%2>%3)" ).arg ( nPoints ).arg ( nPoints * ( 2 * sizeof ( double ) + skipZM ) ).arg ( wkbPtr.remaining () ) );
137
+ return QgsConstWkbPtr ( nullptr , 0 );
138
+ }
139
+
140
+ pts.resize ( nPoints );
141
+
136
142
QPointF *ptr = pts.data ();
137
143
for ( unsigned int i = 0 ; i < nPoints; ++i, ++ptr )
138
144
{
@@ -182,6 +188,12 @@ QgsConstWkbPtr QgsSymbolV2::_getPolygon( QPolygonF &pts, QList<QPolygonF> &holes
182
188
unsigned int nPoints;
183
189
wkbPtr >> nPoints;
184
190
191
+ if ( static_cast <int >( nPoints * ( 2 * sizeof ( double ) + skipZM ) ) > wkbPtr.remaining () )
192
+ {
193
+ QgsDebugMsg ( QString ( " %1 points exceed wkb length (%2>%3)" ).arg ( nPoints ).arg ( nPoints * ( 2 * sizeof ( double ) + skipZM ) ).arg ( wkbPtr.remaining () ) );
194
+ return QgsConstWkbPtr ( nullptr , 0 );
195
+ }
196
+
185
197
QPolygonF poly ( nPoints );
186
198
187
199
QPointF *ptr = poly.data ();
@@ -801,7 +813,7 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
801
813
802
814
const QgsGeometryCollectionV2* geomCollection = dynamic_cast <const QgsGeometryCollectionV2*>( geom->geometry () );
803
815
804
- for ( unsigned int i = 0 ; i < num; ++i )
816
+ for ( unsigned int i = 0 ; i < num && wkbPtr ; ++i )
805
817
{
806
818
mSymbolRenderContext ->expressionContextScope ()->setVariable ( QgsExpressionContext::EXPR_GEOMETRY_PART_NUM, i + 1 );
807
819
@@ -835,7 +847,7 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
835
847
836
848
const QgsGeometryCollectionV2* geomCollection = dynamic_cast <const QgsGeometryCollectionV2*>( geom->geometry () );
837
849
838
- for ( unsigned int i = 0 ; i < num; ++i )
850
+ for ( unsigned int i = 0 ; i < num && wkbPtr ; ++i )
839
851
{
840
852
mSymbolRenderContext ->expressionContextScope ()->setVariable ( QgsExpressionContext::EXPR_GEOMETRY_PART_NUM, i + 1 );
841
853
@@ -849,8 +861,27 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
849
861
}
850
862
break ;
851
863
}
864
+ case QgsWKBTypes::GeometryCollection:
865
+ {
866
+ QgsConstWkbPtr wkbPtr ( segmentizedGeometry->asWkb (), segmentizedGeometry->wkbSize () );
867
+ wkbPtr.readHeader ();
868
+
869
+ int nGeometries;
870
+ wkbPtr >> nGeometries;
871
+
872
+ if ( nGeometries == 0 )
873
+ {
874
+ // skip noise from empty geometry collections from simplification
875
+ break ;
876
+ }
877
+
878
+ FALLTHROUGH;
879
+ }
852
880
default :
853
- QgsDebugMsg ( QString ( " feature %1: unsupported wkb type 0x%2 for rendering" ).arg ( feature.id () ).arg ( geom->wkbType (), 0 , 16 ) );
881
+ QgsDebugMsg ( QString ( " feature %1: unsupported wkb type %2/%3 for rendering" )
882
+ .arg ( feature.id () )
883
+ .arg ( QgsWKBTypes::displayString ( geom->geometry ()->wkbType () ) )
884
+ .arg ( geom->wkbType (), 0 , 16 ) );
854
885
}
855
886
856
887
if ( drawVertexMarker )
0 commit comments