Skip to content

Commit 8ae45fa

Browse files
committedNov 11, 2017
[GML parser/WFS provider] Fix crash when typename and geometry field name are identical (fixes #15942)
1 parent 269038e commit 8ae45fa

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed
 

‎src/core/qgsgml.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,9 @@ void QgsGmlStreamingParser::startElement( const XML_Char* el, const XML_Char** a
555555
}
556556
}
557557
}
558-
else if ( localNameLen == static_cast<int>( mGeometryAttributeUTF8Len ) &&
558+
else if ( ( theParseMode == feature || theParseMode == featureTuple ) &&
559+
mCurrentFeature &&
560+
localNameLen == static_cast<int>( mGeometryAttributeUTF8Len ) &&
559561
memcmp( pszLocalName, mGeometryAttributePtr, localNameLen ) == 0 )
560562
{
561563
mParseModeStack.push( QgsGmlStreamingParser::geometry );
@@ -903,6 +905,7 @@ void QgsGmlStreamingParser::endElement( const XML_Char* el )
903905
{
904906
g->transform( QTransform( 0, 1, 1, 0, 0, 0 ) );
905907
}
908+
Q_ASSERT( mCurrentFeature );
906909
mCurrentFeature->setGeometry( g );
907910
OGR_G_DestroyGeometry( hGeom );
908911
}

‎tests/src/core/testqgsgml.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class TestQgsGML : public QObject
7676
void testThroughOGRGeometry();
7777
void testThroughOGRGeometry_urn_EPSG_4326();
7878
void testAccents();
79+
void testSameTypeameAsGeomName();
7980
};
8081

8182
const QString data1( "<myns:FeatureCollection "
@@ -1149,6 +1150,51 @@ void TestQgsGML::testAccents()
11491150
QCOMPARE( multi[0][0].size(), 5 );
11501151
delete features[0].first;
11511152
}
1153+
void TestQgsGML::testSameTypeameAsGeomName()
1154+
{
1155+
QgsFields fields;
1156+
QgsGmlStreamingParser gmlParser( "foo", "foo", fields );
1157+
QCOMPARE( gmlParser.processData( QByteArray( "<myns:FeatureCollection "
1158+
"xmlns:myns='http://myns' "
1159+
"xmlns:gml='http://www.opengis.net/gml'>"
1160+
"<gml:featureMember>"
1161+
"<myns:foo fid='foo.1'>"
1162+
"<myns:foo>"
1163+
"<gml:MultiSurface srsName='EPSG:27700'>"
1164+
"<gml:surfaceMember>"
1165+
"<gml:Polygon srsName='EPSG:27700'>"
1166+
"<gml:exterior>"
1167+
"<gml:LinearRing>"
1168+
"<gml:posList>0 0 0 10 10 10 10 0 0 0</gml:posList>"
1169+
"</gml:LinearRing>"
1170+
"</gml:exterior>"
1171+
"</gml:Polygon>"
1172+
"</gml:surfaceMember>"
1173+
"<gml:surfaceMember>"
1174+
"<gml:Polygon srsName='EPSG:27700'>"
1175+
"<gml:exterior>"
1176+
"<gml:LinearRing>"
1177+
"<gml:posList>0 0 0 10 10 10 10 0 0 0</gml:posList>"
1178+
"</gml:LinearRing>"
1179+
"</gml:exterior>"
1180+
"</gml:Polygon>"
1181+
"</gml:surfaceMember>"
1182+
"</gml:MultiSurface>"
1183+
"</myns:foo>"
1184+
"</myns:foo>"
1185+
"</gml:featureMember>"
1186+
"</myns:FeatureCollection>" ), true ), true );
1187+
QCOMPARE( gmlParser.wkbType(), QGis::WKBMultiPolygon );
1188+
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
1189+
QCOMPARE( features.size(), 1 );
1190+
QVERIFY( features[0].first->constGeometry() != nullptr );
1191+
QCOMPARE( features[0].first->constGeometry()->wkbType(), QGis::WKBMultiPolygon );
1192+
QgsMultiPolygon multi = features[0].first->constGeometry()->asMultiPolygon();
1193+
QCOMPARE( multi.size(), 2 );
1194+
QCOMPARE( multi[0].size(), 1 );
1195+
QCOMPARE( multi[0][0].size(), 5 );
1196+
delete features[0].first;
1197+
}
11521198

11531199
QTEST_MAIN( TestQgsGML )
11541200
#include "testqgsgml.moc"

0 commit comments

Comments
 (0)
Please sign in to comment.