From: Sandro Santilli Date: Wed, 26 Aug 2015 16:39:07 +0000 (+0000) Subject: More leaks plugged on edge split X-Git-Tag: 2.2.0rc1~82 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=003c677c9bdcbc52ef047324d35018f676d6c891;p=postgis More leaks plugged on edge split git-svn-id: http://svn.osgeo.org/postgis/trunk@14012 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/lwgeom_topo.c b/liblwgeom/lwgeom_topo.c index 8fc982515..d4c5e66e6 100644 --- a/liblwgeom/lwgeom_topo.c +++ b/liblwgeom/lwgeom_topo.c @@ -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;