Changeset: 422b840e887c for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=422b840e887c Modified Files: geom/monetdb5/geom.c Branch: sfcgal Log Message:
Fix more leaks detected by valgrind. When a WKB is appended to a BAT you need to free it. diffs (113 lines): diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c --- a/geom/monetdb5/geom.c +++ b/geom/monetdb5/geom.c @@ -2356,7 +2356,10 @@ wkbPolygonize_(wkb** outWKB, wkb** geom1 str wkbPolygonize(wkb** outWKB, wkb** geom1) { - wkb *geom2 = geos2wkb(GEOSGeom_createEmptyCollection(wkbGeometryCollection_mdb - 1)); + GEOSGeometry* emptyCol = GEOSGeom_createEmptyCollection(wkbGeometryCollection_mdb - 1); + wkb *geom2 = geos2wkb(emptyCol); + GEOSGeom_destroy(emptyCol); + return wkbPolygonize_(outWKB, geom1, &geom2); } @@ -2398,8 +2401,11 @@ wkbsubPolygonize(bat *outBAT_id, bat* bB if ( ngrp && (empty_geoms = (wkb**) GDKmalloc(sizeof(wkb*)*ngrp)) == NULL) { throw(MAL, "geom.wkbPolygonize", MAL_MALLOC_FAIL); } - for (i = 0; i < ngrp; i++) - empty_geoms[i] = geos2wkb(GEOSGeom_createEmptyCollection(wkbGeometryCollection_mdb - 1)); + for (i = 0; i < ngrp; i++) { + GEOSGeometry* emptyCol = GEOSGeom_createEmptyCollection(wkbGeometryCollection_mdb - 1); + empty_geoms[i] = geos2wkb(emptyCol); + GEOSGeom_destroy(emptyCol); + } msg = BATgroupWKBWKBtoWKB(outBAT_id, b, g, e, skip_nils, min, max, ngrp, start, end, empty_geoms, wkbPolygonize_, "wkbsubPolygonize"); BBPkeepref(*outBAT_id); @@ -5592,6 +5598,7 @@ BATgroupWKBWKBtoWKB(bat *outBAT_id, BAT outBAT = NULL; throw(MAL, name, "BUNappend failed"); } + GDKfree(grpWKBs[i]); } if (nils < BUN_NONE) { @@ -5718,10 +5725,14 @@ wkbCollectAppend(wkb **out, wkb **geom1W geomGeometries[num_geoms] = geom2Geometry; if ( (outGeometry = GEOSGeom_createCollection(type, geomGeometries, num_geoms+1)) == NULL ) { - err = createException(MAL, "geom.Collect", "GEOSGeom_createCollection failed!!!"); + GDKfree(geomGeometries); + GEOSGeom_destroy(geom1Geometry); + GEOSGeom_destroy(geom2Geometry); + throw(MAL, "geom.Collect", "GEOSGeom_createCollection failed!!!"); } else { GEOSSetSRID(outGeometry, srid); *out = geos2wkb(outGeometry); + GEOSGeom_destroy(outGeometry); } } @@ -5729,7 +5740,7 @@ wkbCollectAppend(wkb **out, wkb **geom1W GDKfree(geomGeometries); GEOSGeom_destroy(geom1Geometry); - GEOSGeom_destroy(geom2Geometry); + //GEOSGeom_destroy(geom2Geometry); return err; } @@ -5774,12 +5785,17 @@ wkbsubCollect(bat *outBAT_id, bat* bBAT_ BBPunfix(e->batCacheid); throw(MAL, "geom.wkbsubCollect", MAL_MALLOC_FAIL); } - for (i = 0; i < ngrp; i++) - empty_geoms[i] = geos2wkb(GEOSGeom_createEmptyCollection(wkbGeometryCollection_mdb - 1)); + for (i = 0; i < ngrp; i++) { + GEOSGeometry* emptyCol = GEOSGeom_createEmptyCollection(wkbGeometryCollection_mdb - 1); + empty_geoms[i] = geos2wkb(emptyCol); + GEOSGeom_destroy(emptyCol); + } msg = BATgroupWKBWKBtoWKB(outBAT_id, b, g, e, skip_nils, min, max, ngrp, start, end, empty_geoms, wkbCollectAppend, "wkbsubCollect"); BBPkeepref(*outBAT_id); + for (i = 0; i < ngrp; i++) + GDKfree(empty_geoms[i]); GDKfree(empty_geoms); BBPunfix(b->batCacheid); BBPunfix(g->batCacheid); @@ -8047,6 +8063,8 @@ wkbAsX3D(str *res, wkb **geomWKB, int *m GEOSGeom geom = NULL; int srid; bit empty; + int dimension = 0; + int type = -1; //check if the geometry is empty if ((ret = wkbIsEmpty(&empty, geomWKB)) != MAL_SUCCEED) { @@ -8070,7 +8088,12 @@ wkbAsX3D(str *res, wkb **geomWKB, int *m } } - + dimension= GEOS_getWKBOutputDims(geom); + type = GEOSGeomTypeId(geom)+1; + + if (dimension == 2 && type == wkbMultiPolygon_mdb) { + throw(MAL, "geom.wkbAsX3D", "For a MultiPolygon the dimension should be 3."); + } if ( (*res = geom_to_x3d_3(geom, *maxDecDigits, *option, defid)) == NULL ) throw(MAL, "geom.wkbAsX3D", "Failed, XML returned is NULL!!!"); @@ -8332,6 +8355,7 @@ IsValidsubselect_intern(bat *lresBAT_id, BBPunfix(lBAT->batCacheid); GDKfree(lBAT_iters); + GDKfree(outs); if (*slBAT_id != bat_nil) { GDKfree(slBAT_iters); BBPunfix(slBAT->batCacheid); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list