[geos-commits] [SCM] geos branch svn-3.6 updated. 687d2b49a9acc2de82f5bfd481e3aaa8d9b45af7
git at osgeo.org
git at osgeo.org
Sat Apr 15 02:36:10 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-3.6 has been updated
via 687d2b49a9acc2de82f5bfd481e3aaa8d9b45af7 (commit)
via a823bca3dd2b8a9446b465b594b76e9da8b04199 (commit)
from 5a935ddb0246619706a28b78441053eb2e65258a (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 687d2b49a9acc2de82f5bfd481e3aaa8d9b45af7
Author: Sandro Santilli <strk at kbt.io>
Date: Sat Apr 15 10:09:23 2017 +0200
Add NEWS item about WKTReader leak fixes
diff --git a/NEWS b/NEWS
index d1afeef..ee3cfcc 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@ Changes in 3.6.2dev
- AppVeyor CI build added (#813)
- Clean up numerous MSVC warnings, notably C4275 and C4589 (#814)
- Bump CMake version to 3.0.0 (#817)
+ - Fix leaks in WKT parser (#830)
Changes in 3.6.1
2016-12-24
commit a823bca3dd2b8a9446b465b594b76e9da8b04199
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 4794499..1b173e0 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 866ef25..4488943 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:
NEWS | 1 +
src/io/WKTReader.cpp | 59 +++++++++++++++++++++++++++++----------
tests/unit/io/WKTReaderTest.cpp | 23 ++++++++++++++-
3 files changed, 67 insertions(+), 16 deletions(-)
hooks/post-receive
--
geos
More information about the geos-commits
mailing list