[geos-commits] [SCM] geos branch svn-trunk updated. 84477476f382c4d40860879dfbbc96b6e1d16f39
git at osgeo.org
git at osgeo.org
Sat Apr 15 01:08:19 PDT 2017
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "geos".
The branch, svn-trunk has been updated
via 84477476f382c4d40860879dfbbc96b6e1d16f39 (commit)
from b8c7ea3e61f38f64edca2d5322c9ad14a10ff6a3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 84477476f382c4d40860879dfbbc96b6e1d16f39
Author: Kurt Schwehr <schwehr at google.com>
Date: Wed Apr 12 14:21:06 2017 -0700
Fix leaks in WKT parser
Cleanup if failing to parse the WKT MultiLineString, MultiPolygon,
and GeometryCollection string.
Wrap parsing in try blocks.
Catch any exception, cleanup, and rethrow.
Closes #830
Includes testcase
Signed-off-by: Sandro Santilli <strk at kbt.io>
diff --git a/src/io/WKTReader.cpp b/src/io/WKTReader.cpp
index dc0259c..b1b885e 100644
--- a/src/io/WKTReader.cpp
+++ b/src/io/WKTReader.cpp
@@ -400,13 +400,23 @@ MultiLineString* WKTReader::readMultiLineStringText(StringTokenizer *tokenizer)
return geometryFactory->createMultiLineString(NULL);
}
vector<Geometry *> *lineStrings=new vector<Geometry *>();
- LineString *lineString=readLineStringText(tokenizer);
- lineStrings->push_back(lineString);
- nextToken=getNextCloserOrComma(tokenizer);
- while(nextToken==",") {
- LineString *lineString=readLineStringText(tokenizer);
+ LineString *lineString = NULL;
+ try {
+ lineString=readLineStringText(tokenizer);
lineStrings->push_back(lineString);
+ lineString=NULL;
nextToken=getNextCloserOrComma(tokenizer);
+ while(nextToken==",") {
+ lineString=readLineStringText(tokenizer);
+ lineStrings->push_back(lineString);
+ lineString=NULL;
+ nextToken=getNextCloserOrComma(tokenizer);
+ }
+ } catch (...) {
+ for (size_t i=0; i < lineStrings->size(); i++)
+ delete (*lineStrings)[i];
+ delete lineStrings;
+ throw;
}
MultiLineString *ret = geometryFactory->createMultiLineString(lineStrings);
//for (int i=0; i<lineStrings->size(); i++) delete (*lineStrings)[i];
@@ -420,13 +430,23 @@ MultiPolygon* WKTReader::readMultiPolygonText(StringTokenizer *tokenizer) {
return geometryFactory->createMultiPolygon(NULL);
}
vector<Geometry *> *polygons=new vector<Geometry *>();
- Polygon *polygon=readPolygonText(tokenizer);
- polygons->push_back(polygon);
- nextToken=getNextCloserOrComma(tokenizer);
- while(nextToken==",") {
- Polygon *polygon=readPolygonText(tokenizer);
+ Polygon *polygon = NULL;
+ try {
+ polygon=readPolygonText(tokenizer);
polygons->push_back(polygon);
+ polygon=NULL;
nextToken=getNextCloserOrComma(tokenizer);
+ while(nextToken==",") {
+ polygon=readPolygonText(tokenizer);
+ polygons->push_back(polygon);
+ polygon=NULL;
+ nextToken=getNextCloserOrComma(tokenizer);
+ }
+ } catch (...) {
+ for (size_t i=0; i < polygons->size(); i++)
+ delete (*polygons)[i];
+ delete polygons;
+ throw;
}
MultiPolygon *ret = geometryFactory->createMultiPolygon(polygons);
//for (int i=0; i<polygons->size(); i++) delete (*polygons)[i];
@@ -440,14 +460,23 @@ GeometryCollection* WKTReader::readGeometryCollectionText(StringTokenizer *token
return geometryFactory->createGeometryCollection(NULL);
}
vector<Geometry *> *geoms=new vector<Geometry *>();
- Geometry *geom;
- geom=readGeometryTaggedText(tokenizer);
- geoms->push_back(geom);
- nextToken=getNextCloserOrComma(tokenizer);
- while(nextToken==",") {
+ Geometry *geom=NULL;
+ try {
geom=readGeometryTaggedText(tokenizer);
geoms->push_back(geom);
+ geom=NULL;
nextToken=getNextCloserOrComma(tokenizer);
+ while(nextToken==",") {
+ geom=readGeometryTaggedText(tokenizer);
+ geoms->push_back(geom);
+ geom=NULL;
+ nextToken=getNextCloserOrComma(tokenizer);
+ }
+ } catch (...) {
+ for (size_t i=0; i < geoms->size(); i++)
+ delete (*geoms)[i];
+ delete geoms;
+ throw;
}
GeometryCollection *ret = geometryFactory->createGeometryCollection(geoms);
//for (int i=0; i<geoms->size(); i++) delete (*geoms)[i];
diff --git a/tests/unit/io/WKTReaderTest.cpp b/tests/unit/io/WKTReaderTest.cpp
index 327983d..554062c 100644
--- a/tests/unit/io/WKTReaderTest.cpp
+++ b/tests/unit/io/WKTReaderTest.cpp
@@ -171,6 +171,27 @@ namespace tut
ensure( !"Got unexpected exception" );
}
}
-} // namespace tut
+ // 8 - invalid WKT (see https://trac.osgeo.org/geos/ticket/830)
+ template<>
+ template<>
+ void object::test<8>()
+ {
+ // All of these strings cause an exception during read().
+ std::vector<std::string> wkt;
+ wkt.push_back("MULTILINESTRING(");
+ wkt.push_back("MULTIPOLYGON(");
+ wkt.push_back("MULTIPOLYGON(EMPTY(");
+ wkt.push_back("GEOMETRYCOLLECTION(");
+ wkt.push_back("GEOMETRYCOLLECTION(LINEARRING(");
+ for (size_t i = 0; i < wkt.size(); i++) {
+ try {
+ wktreader.read(wkt[i]);
+ ensure( !"Didn't get expected exception" );
+ } catch (...) {
+ ensure( "Did get expected exception" );
+ }
+ }
+ }
+} // namespace tut
-----------------------------------------------------------------------
Summary of changes:
src/io/WKTReader.cpp | 59 +++++++++++++++++++++++++++++----------
tests/unit/io/WKTReaderTest.cpp | 23 ++++++++++++++-
2 files changed, 66 insertions(+), 16 deletions(-)
hooks/post-receive
--
geos
More information about the geos-commits
mailing list