]> granicus.if.org Git - postgis/commitdiff
Finish working on Dave Fuhry's memory-leak patch, and also fix several other leaks...
authorMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Fri, 20 Nov 2009 13:53:48 +0000 (13:53 +0000)
committerMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Fri, 20 Nov 2009 13:53:48 +0000 (13:53 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@4868 b70326c6-7e19-0410-871a-916f4a2858ee

loader/shp2pgsql.c

index 16a3baf444c7937857323ead4e925693fe6a83db..0dca2841251db4c567cc98d07e95789199927545 100644 (file)
@@ -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);