]> granicus.if.org Git - postgis/commitdiff
Do not leak POINTARRAY objects on edge split
authorSandro Santilli <strk@keybit.net>
Wed, 26 Aug 2015 16:18:12 +0000 (16:18 +0000)
committerSandro Santilli <strk@keybit.net>
Wed, 26 Aug 2015 16:18:12 +0000 (16:18 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@14011 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/lwgeom_topo.c

index bc549d70aad3151082852b9b42e50da469deadbb..8fc982515baad7d5a6bb971ac40b2f25534ee44a 100644 (file)
@@ -973,12 +973,12 @@ _lwt_EdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge, LWPOINT* pt, int skipISOChe
   }
   split_col = lwgeom_as_lwcollection(split);
   if ( ! split_col ) {
-    lwgeom_release(split);
+    lwgeom_free(split);
     lwerror("lwgeom_as_lwcollection returned NULL");
     return NULL;
   }
   if (split_col->ngeoms < 2) {
-    lwgeom_release(split);
+    lwgeom_free(split);
     lwerror("SQL/MM Spatial exception - point not on edge");
     return NULL;
   }
@@ -1009,11 +1009,13 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   node.geom = pt;
   if ( ! lwt_be_insertNodes(topo, &node, 1) )
   {
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
   if (node.node_id == -1) {
     /* should have been set by backend */
+    lwcollection_free(split_col);
     lwerror("Backend coding error: "
             "insertNodes callback did not return node_id");
     return -1;
@@ -1022,7 +1024,7 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   /* Insert the new edge */
   newedge1.edge_id = lwt_be_getNextEdgeId(topo);
   if ( newedge1.edge_id == -1 ) {
-    lwcollection_release(split_col);
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
@@ -1036,16 +1038,17 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   newedge1.geom = lwgeom_as_lwline(newedge_geom);
   /* lwgeom_split of a line should only return lines ... */
   if ( ! newedge1.geom ) {
-    lwcollection_release(split_col);
+    lwcollection_free(split_col);
     lwerror("first geometry in lwgeom_split output is not a line");
     return -1;
   }
   ret = lwt_be_insertEdges(topo, &newedge1, 1);
   if ( ret == -1 ) {
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   } else if ( ret == 0 ) {
-    lwcollection_release(split_col);
+    lwcollection_free(split_col);
     lwerror("Insertion of split edge failed (no reason)");
     return -1;
   }
@@ -1054,7 +1057,7 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   updedge.geom = lwgeom_as_lwline(oldedge_geom);
   /* lwgeom_split of a line should only return lines ... */
   if ( ! updedge.geom ) {
-    lwcollection_release(split_col);
+    lwcollection_free(split_col);
     lwerror("second geometry in lwgeom_split output is not a line");
     return -1;
   }
@@ -1065,12 +1068,15 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
       &updedge, LWT_COL_EDGE_GEOM|LWT_COL_EDGE_NEXT_LEFT|LWT_COL_EDGE_END_NODE,
       NULL, 0);
   if ( ret == -1 ) {
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   } else if ( ret == 0 ) {
+    lwcollection_free(split_col);
     lwerror("Edge being splitted (%d) disappeared during operations?", oldedge->edge_id);
     return -1;
   } else if ( ret > 1 ) {
+    lwcollection_free(split_col);
     lwerror("More than a single edge found with id %d !", oldedge->edge_id);
     return -1;
   }
@@ -1086,6 +1092,7 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
       &updedge, LWT_COL_EDGE_NEXT_RIGHT,
       &excedge, LWT_COL_EDGE_EDGE_ID);
   if ( ret == -1 ) {
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
@@ -1099,7 +1106,7 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
       &updedge, LWT_COL_EDGE_NEXT_LEFT,
       &excedge, LWT_COL_EDGE_EDGE_ID);
   if ( ret == -1 ) {
-    lwcollection_release(split_col);
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
@@ -1107,12 +1114,12 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   /* Update TopoGeometries composition */
   ret = lwt_be_updateTopoGeomEdgeSplit(topo, oldedge->edge_id, newedge1.edge_id, -1);
   if ( ! ret ) {
-    lwcollection_release(split_col);
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
 
-  lwcollection_release(split_col);
+  lwcollection_free(split_col);
 
   /* return new node id */
   return node.node_id;