Skip to content

Commit 66518eb

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

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed
 

‎src/core/qgsgml.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,9 @@ void QgsGmlStreamingParser::startElement( const XML_Char *el, const XML_Char **a
543543
}
544544
}
545545
}
546-
else if ( localNameLen == static_cast<int>( mGeometryAttributeUTF8Len ) &&
546+
else if ( ( parseMode == Feature || parseMode == FeatureTuple ) &&
547+
mCurrentFeature &&
548+
localNameLen == static_cast<int>( mGeometryAttributeUTF8Len ) &&
547549
memcmp( pszLocalName, mGeometryAttributePtr, localNameLen ) == 0 )
548550
{
549551
mParseModeStack.push( QgsGmlStreamingParser::Geometry );
@@ -887,6 +889,7 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
887889
{
888890
g.transform( QTransform( 0, 1, 1, 0, 0, 0 ) );
889891
}
892+
Q_ASSERT( mCurrentFeature );
890893
mCurrentFeature->setGeometry( g );
891894
}
892895
}

‎tests/src/core/testqgsgml.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class TestQgsGML : public QObject
7878
void testThroughOGRGeometry();
7979
void testThroughOGRGeometry_urn_EPSG_4326();
8080
void testAccents();
81+
void testSameTypeameAsGeomName();
8182
};
8283

8384
const QString data1( "<myns:FeatureCollection "
@@ -1153,5 +1154,51 @@ void TestQgsGML::testAccents()
11531154
delete features[0].first;
11541155
}
11551156

1157+
void TestQgsGML::testSameTypeameAsGeomName()
1158+
{
1159+
QgsFields fields;
1160+
QgsGmlStreamingParser gmlParser( QStringLiteral( "foo" ), QStringLiteral( "foo" ), fields );
1161+
QCOMPARE( gmlParser.processData( QByteArray( "<myns:FeatureCollection "
1162+
"xmlns:myns='http://myns' "
1163+
"xmlns:gml='http://www.opengis.net/gml'>"
1164+
"<gml:featureMember>"
1165+
"<myns:foo fid='foo.1'>"
1166+
"<myns:foo>"
1167+
"<gml:MultiSurface srsName='EPSG:27700'>"
1168+
"<gml:surfaceMember>"
1169+
"<gml:Polygon srsName='EPSG:27700'>"
1170+
"<gml:exterior>"
1171+
"<gml:LinearRing>"
1172+
"<gml:posList>0 0 0 10 10 10 10 0 0 0</gml:posList>"
1173+
"</gml:LinearRing>"
1174+
"</gml:exterior>"
1175+
"</gml:Polygon>"
1176+
"</gml:surfaceMember>"
1177+
"<gml:surfaceMember>"
1178+
"<gml:Polygon srsName='EPSG:27700'>"
1179+
"<gml:exterior>"
1180+
"<gml:LinearRing>"
1181+
"<gml:posList>0 0 0 10 10 10 10 0 0 0</gml:posList>"
1182+
"</gml:LinearRing>"
1183+
"</gml:exterior>"
1184+
"</gml:Polygon>"
1185+
"</gml:surfaceMember>"
1186+
"</gml:MultiSurface>"
1187+
"</myns:foo>"
1188+
"</myns:foo>"
1189+
"</gml:featureMember>"
1190+
"</myns:FeatureCollection>" ), true ), true );
1191+
QCOMPARE( gmlParser.wkbType(), QgsWkbTypes::MultiPolygon );
1192+
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
1193+
QCOMPARE( features.size(), 1 );
1194+
QVERIFY( features[0].first->hasGeometry() );
1195+
QCOMPARE( features[0].first->geometry().wkbType(), QgsWkbTypes::MultiPolygon );
1196+
QgsMultiPolygonXY multi = features[0].first->geometry().asMultiPolygon();
1197+
QCOMPARE( multi.size(), 2 );
1198+
QCOMPARE( multi[0].size(), 1 );
1199+
QCOMPARE( multi[0][0].size(), 5 );
1200+
delete features[0].first;
1201+
}
1202+
11561203
QGSTEST_MAIN( TestQgsGML )
11571204
#include "testqgsgml.moc"

0 commit comments

Comments
 (0)
Please sign in to comment.