From: Mark Cave-Ayland Date: Fri, 20 Nov 2009 13:53:48 +0000 (+0000) Subject: Finish working on Dave Fuhry's memory-leak patch, and also fix several other leaks... X-Git-Tag: 1.5.0b1~202 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=db6ae3a79c3732993204165098763e451c78a256;p=postgis Finish working on Dave Fuhry's memory-leak patch, and also fix several other leaks found by running shp2pgsql through valgrind. git-svn-id: http://svn.osgeo.org/postgis/trunk@4868 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/loader/shp2pgsql.c b/loader/shp2pgsql.c index 16a3baf44..0dca28412 100644 --- a/loader/shp2pgsql.c +++ b/loader/shp2pgsql.c @@ -461,6 +461,7 @@ main (int ARGC, char **ARGV) printf("END;\n"); /* End the last transaction */ + Cleanup(); return 0; }/*end main() */ @@ -816,7 +817,7 @@ usage(char *me, int exitcode, FILE* out) void InsertLineString() { - LWCOLLECTION *lwcollection; + LWCOLLECTION *lwcollection = NULL; LWGEOM **lwmultilinestrings; uchar *serialized_lwgeom; @@ -904,13 +905,32 @@ InsertLineString() OutputGeometry(lwg_unparser_result.wkoutput); /* Free all of the allocated items */ - lwfree(lwg_unparser_result.wkoutput); - lwfree(serialized_lwgeom); + lwfree(lwg_unparser_result.wkoutput); + lwfree(serialized_lwgeom); - for (u = 0; u < obj->nParts; u++) + /* Free the collection or linestring as required */ + if (simple_geometries == 0) { + for (u = 0; u < obj->nParts; u++) + { + if (dpas[u]->pa->serialized_pointlist) + lwfree(dpas[u]->pa->serialized_pointlist); + + lwfree(dpas[u]->pa); + lwfree(dpas[u]); + + lwfree(lwmultilinestrings[u]); + } + + lwfree(lwcollection); + } + else + { + for (u = 0; u < obj->nParts; u++) + { lwline_free(lwgeom_as_lwline(lwmultilinestrings[u])); lwfree(dpas[u]); + } } lwfree(dpas); @@ -1170,8 +1190,6 @@ InsertPolygon(void) lwpolygons[pi] = lwpoly_as_lwgeom(lwpoly); } - ReleasePolygons(Outer, polygon_total); - /* If using MULTIPOLYGONS then generate the serialized collection, otherwise just a single POLYGON */ if (simple_geometries == 0) { @@ -1183,6 +1201,23 @@ InsertPolygon(void) serialized_lwgeom = lwgeom_serialize(lwpolygons[0]); } + /* Note: lwpoly_free() currently doesn't free its serialized pointlist, so do it manually */ + for(pi = 0; pi < polygon_total; pi++) + { + Ring *polyring = Outer[pi]; + int ring_index = 0; + while (polyring) + { + if (pas[pi][ring_index]->serialized_pointlist) + lwfree(pas[pi][ring_index]->serialized_pointlist); + + polyring = polyring->next; + ring_index++; + } + } + + ReleasePolygons(Outer, polygon_total); + if (!hwgeom) result = serialized_lwgeom_to_hexwkb(&lwg_unparser_result, serialized_lwgeom, PARSER_CHECK_NONE, -1); else @@ -1197,8 +1232,8 @@ InsertPolygon(void) OutputGeometry(lwg_unparser_result.wkoutput); /* Free all of the allocated items */ - lwfree(lwg_unparser_result.wkoutput); - lwfree(serialized_lwgeom); + lwfree(lwg_unparser_result.wkoutput); + lwfree(serialized_lwgeom); /* Cycle through each polygon, freeing everything we need... */ for (u = 0; u < polygon_total; u++) @@ -1287,13 +1322,17 @@ InsertPoint(void) OutputGeometry(lwg_unparser_result.wkoutput); /* Free all of the allocated items */ - lwfree(lwg_unparser_result.wkoutput); - lwfree(serialized_lwgeom); + lwfree(lwg_unparser_result.wkoutput); + lwfree(serialized_lwgeom); for (u = 0; u < obj->nVertices; u++) { - lwpoint_free(lwgeom_as_lwpoint(lwmultipoints[u])); - lwfree(dpas[u]); + if (dpas[u]->pa->serialized_pointlist) + lwfree(dpas[u]->pa->serialized_pointlist); + + lwpoint_free(lwgeom_as_lwpoint(lwmultipoints[u])); + + lwfree(dpas[u]); } lwfree(dpas);