[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