[geos-devel] Potential memory leak in GEOSTopologyPreserveSimplify

Bill Zissimopoulos geos at billz.fastmail.fm
Thu Jan 31 01:27:31 EST 2008


I have spent time investigating this memory leak and produced a patch
that I believe fixes it. The patch is included in this mail.

The GEOS tests (make check) pass with this patch. However in one of my
private tests I found a one point difference in the simplified polyline
produced with and without the patch (one point missing with this patch).
Because the resulting polyline looks correct to me I decided to
incorporate the patch, however your decision may be different.


I would much appreciate it if someone more knowledgeable than I gave the
patch a look. Thank you.

Bill

diff -Naur geos-3.0.0/source/index/quadtree/NodeBase.cpp
geos-3.0.0.new/source/index/quadtree/NodeBase.cpp
--- geos-3.0.0/source/index/quadtree/NodeBase.cpp       2007-12-12
13:59:26.000000000 -0800
+++ geos-3.0.0.new/source/index/quadtree/NodeBase.cpp   2008-01-30
20:59:05.000000000 -0800
@@ -215,7 +215,10 @@
 			if (found) {
 				// trim subtree if empty
 				if (subnode[i]->isPrunable())
-                               subnode[i] = NULL;
+                               {
+                                       delete subnode[i];
+                                       subnode[i] = NULL;
+                               }
 				break;
 			}
 		}
diff -Naur geos-3.0.0/source/index/quadtree/Quadtree.cpp
geos-3.0.0.new/source/index/quadtree/Quadtree.cpp
--- geos-3.0.0/source/index/quadtree/Quadtree.cpp       2007-12-12
13:59:26.000000000 -0800
+++ geos-3.0.0.new/source/index/quadtree/Quadtree.cpp   2008-01-30
20:59:05.000000000 -0800
@@ -142,7 +142,10 @@
 Quadtree::remove(const Envelope* itemEnv, void* item)
 {
 	Envelope* posEnv = ensureExtent(itemEnv, minExtent);
-       return root->remove(posEnv, item);
+       bool result = root->remove(posEnv, item);
+       if (itemEnv != posEnv)
+               delete posEnv;
+       return result;
 }
 
 /*private*/


More information about the geos-devel mailing list