From 58b08f11509c354fa9966fd4b8bdfbf38bc08262 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Wed, 26 Aug 2015 16:18:12 +0000 Subject: [PATCH] Do not leak POINTARRAY objects on edge split git-svn-id: http://svn.osgeo.org/postgis/trunk@14011 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/lwgeom_topo.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/liblwgeom/lwgeom_topo.c b/liblwgeom/lwgeom_topo.c index bc549d70a..8fc982515 100644 --- a/liblwgeom/lwgeom_topo.c +++ b/liblwgeom/lwgeom_topo.c @@ -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; -- 2.40.0