]> granicus.if.org Git - postgis/commitdiff
More leaks plugged on edge split
authorSandro Santilli <strk@keybit.net>
Wed, 26 Aug 2015 16:39:07 +0000 (16:39 +0000)
committerSandro Santilli <strk@keybit.net>
Wed, 26 Aug 2015 16:39:07 +0000 (16:39 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@14012 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/lwgeom_topo.c

index 8fc982515baad7d5a6bb971ac40b2f25534ee44a..d4c5e66e62bfa09334c4e06d430e227e86cfff18 100644 (file)
@@ -1009,12 +1009,14 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   node.geom = pt;
   if ( ! lwt_be_insertNodes(topo, &node, 1) )
   {
+    _lwt_release_edges(oldedge, 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 */
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("Backend coding error: "
             "insertNodes callback did not return node_id");
@@ -1024,6 +1026,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 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
@@ -1038,16 +1041,19 @@ 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 ) {
+    _lwt_release_edges(oldedge, 1);;
     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 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   } else if ( ret == 0 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("Insertion of split edge failed (no reason)");
     return -1;
@@ -1057,6 +1063,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 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("second geometry in lwgeom_split output is not a line");
     return -1;
@@ -1068,14 +1075,17 @@ 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 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   } else if ( ret == 0 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("Edge being splitted (%d) disappeared during operations?", oldedge->edge_id);
     return -1;
   } else if ( ret > 1 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("More than a single edge found with id %d !", oldedge->edge_id);
     return -1;
@@ -1092,6 +1102,7 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
       &updedge, LWT_COL_EDGE_NEXT_RIGHT,
       &excedge, LWT_COL_EDGE_EDGE_ID);
   if ( ret == -1 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
@@ -1106,6 +1117,7 @@ lwt_ModEdgeSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
       &updedge, LWT_COL_EDGE_NEXT_LEFT,
       &excedge, LWT_COL_EDGE_EDGE_ID);
   if ( ret == -1 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
@@ -1114,11 +1126,13 @@ 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 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
 
+  _lwt_release_edges(oldedge, 1);;
   lwcollection_free(split_col);
 
   /* return new node id */
@@ -1149,10 +1163,14 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   node.geom = pt;
   if ( ! lwt_be_insertNodes(topo, &node, 1) )
   {
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
   if (node.node_id == -1) {
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     /* should have been set by backend */
     lwerror("Backend coding error: "
             "insertNodes callback did not return node_id");
@@ -1163,6 +1181,8 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   seledge.edge_id = edge;
   ret = lwt_be_deleteEdges(topo, &seledge, LWT_COL_EDGE_EDGE_ID);
   if ( ret == -1 ) {
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
@@ -1170,13 +1190,15 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   /* Get new edges identifiers */
   newedges[0].edge_id = lwt_be_getNextEdgeId(topo);
   if ( newedges[0].edge_id == -1 ) {
-    lwcollection_release(split_col);
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
   newedges[1].edge_id = lwt_be_getNextEdgeId(topo);
   if ( newedges[1].edge_id == -1 ) {
-    lwcollection_release(split_col);
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
@@ -1196,7 +1218,8 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   newedges[0].geom = lwgeom_as_lwline(oldedge_geom);
   /* lwgeom_split of a line should only return lines ... */
   if ( ! newedges[0].geom ) {
-    lwcollection_release(split_col);
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("first geometry in lwgeom_split output is not a line");
     return -1;
   }
@@ -1216,7 +1239,8 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   newedges[1].geom = lwgeom_as_lwline(newedge_geom);
   /* lwgeom_split of a line should only return lines ... */
   if ( ! newedges[1].geom ) {
-    lwcollection_release(split_col);
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("second geometry in lwgeom_split output is not a line");
     return -1;
   }
@@ -1224,10 +1248,12 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   /* Insert both new edges */
   ret = lwt_be_insertEdges(topo, newedges, 2);
   if ( ret == -1 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   } else if ( ret == 0 ) {
-    lwcollection_release(split_col);
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("Insertion of split edge failed (no reason)");
     return -1;
   }
@@ -1242,6 +1268,8 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
       &updedge, LWT_COL_EDGE_NEXT_RIGHT,
       NULL, 0);
   if ( ret == -1 ) {
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
@@ -1254,7 +1282,8 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
       &updedge, LWT_COL_EDGE_NEXT_RIGHT,
       NULL, 0);
   if ( ret == -1 ) {
-    lwcollection_release(split_col);
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
@@ -1267,6 +1296,8 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
       &updedge, LWT_COL_EDGE_NEXT_LEFT,
       NULL, 0);
   if ( ret == -1 ) {
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
@@ -1279,6 +1310,7 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
       &updedge, LWT_COL_EDGE_NEXT_LEFT,
       NULL, 0);
   if ( ret == -1 ) {
+    _lwt_release_edges(oldedge, 1);;
     lwcollection_release(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
@@ -1287,12 +1319,14 @@ lwt_NewEdgesSplit( LWT_TOPOLOGY* topo, LWT_ELEMID edge,
   /* Update TopoGeometries composition */
   ret = lwt_be_updateTopoGeomEdgeSplit(topo, oldedge->edge_id, newedges[0].edge_id, newedges[1].edge_id);
   if ( ! ret ) {
-    lwcollection_release(split_col);
+    _lwt_release_edges(oldedge, 1);;
+    lwcollection_free(split_col);
     lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
     return -1;
   }
 
-  lwcollection_release(split_col);
+  _lwt_release_edges(oldedge, 1);;
+  lwcollection_free(split_col);
 
   /* return new node id */
   return node.node_id;