Changeset: 60c606a20fd0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/60c606a20fd0 Modified Files: sql/backends/monet5/vaults/fits/fits.c sql/backends/monet5/vaults/netcdf/netcdf.c tools/monetdbe/monetdbe.c Branch: Jul2021 Log Message:
Don't leak please diffs (truncated from 306 to 300 lines): diff --git a/sql/backends/monet5/vaults/fits/fits.c b/sql/backends/monet5/vaults/fits/fits.c --- a/sql/backends/monet5/vaults/fits/fits.c +++ b/sql/backends/monet5/vaults/fits/fits.c @@ -1014,8 +1014,10 @@ str FITSloadTable(Client cntxt, MalBlkPt TRC_INFO(FITS, "Loading %ld rows in table %s\n", rows, tname); - if (store->storage_api.claim_tab(m->session->tr, tbl, rows, &offset, &pos) != LOG_OK) - throw(MAL, "fits.loadtable", SQLSTATE(HY013) MAL_MALLOC_FAIL); + if (store->storage_api.claim_tab(m->session->tr, tbl, rows, &offset, &pos) != LOG_OK) { + msg = createException(MAL, "fits.loadtable", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; + } for (j = 1; j <= cnum; j++) { BAT *tmp = NULL; int time0 = GDKms(); @@ -1025,11 +1027,8 @@ str FITSloadTable(Client cntxt, MalBlkPt tmp = COLnew(0, mtype, rows, TRANSIENT); if (tmp == NULL){ - GDKfree(tpcode); - GDKfree(rep); - GDKfree(wid); - GDKfree(cname); - throw(MAL,"fits.load", SQLSTATE(HY013) MAL_MALLOC_FAIL); + msg = createException(MAL,"fits.load", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; } if (mtype == TYPE_blob) { long i; @@ -1040,42 +1039,34 @@ str FITSloadTable(Client cntxt, MalBlkPt nilptr = ATOMnilptr(mtype); if (v == NULL) { - GDKfree(tpcode); - GDKfree(rep); - GDKfree(wid); - GDKfree(cname); - throw(MAL,"fits.load", SQLSTATE(HY013) MAL_MALLOC_FAIL); + BBPreclaim(tmp); + msg = createException(MAL,"fits.load", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; } for(i = 0; i < rows; i++) { v[i] = (blob *)GDKmalloc(offsetof(blob, data) + nbytes); if (v[i] == NULL) { - GDKfree(tpcode); - GDKfree(rep); - GDKfree(wid); - GDKfree(cname); + BBPreclaim(tmp); long k = 0; for (k = 0; k < i; k++) { GDKfree(v[k]); } GDKfree(v); - throw(MAL,"fits.load", SQLSTATE(HY013) MAL_MALLOC_FAIL); + msg = createException(MAL,"fits.load", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; } fits_read_col(fptr, tpcode[j - 1], j, i + 1, 1, rep[j - 1], (void *)nilptr, (void *)v[i]->data, &anynull, &status); v[i]->nitems = nbytes; if (BUNappend(tmp, v[i], false) != GDK_SUCCEED) { BBPreclaim(tmp); - msg = createException(MAL, "fits.loadtable", SQLSTATE(HY013) MAL_MALLOC_FAIL); - GDKfree(tpcode); - GDKfree(rep); - GDKfree(wid); - GDKfree(cname); for (i = 0; i < rows; i++) { GDKfree(v[i]); } GDKfree(v); - return msg; + msg = createException(MAL,"fits.loadtable", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; } } @@ -1122,26 +1113,23 @@ str FITSloadTable(Client cntxt, MalBlkPt if (status) { char buf[FLEN_ERRMSG + 1]; fits_read_errmsg(buf); + BBPreclaim(tmp); msg = createException(MAL, "fits.loadtable", SQLSTATE(FI000) "Cannot load column %s of %s table: %s.\n", cname[j - 1], tname, buf); break; } TRC_INFO(FITS, "#Column %s loaded for %d ms\t", cname[j-1], GDKms() - time0); if (store->storage_api.append_col(m->session->tr, col, offset, pos, tmp, BATcount(tmp), TYPE_bat) != LOG_OK) { - if (pos) - bat_destroy(pos); - BBPunfix(tmp->batCacheid); + BBPreclaim(tmp); msg = createException(MAL, "fits.loadtable", SQLSTATE(HY013) MAL_MALLOC_FAIL); break; } TRC_INFO(FITS, "Total %d ms\n", GDKms() - time0); - BBPunfix(tmp->batCacheid); + BBPreclaim(tmp); } - if (pos) - bat_destroy(pos); bailout: - + bat_destroy(pos); GDKfree(tpcode); GDKfree(rep); GDKfree(wid); diff --git a/sql/backends/monet5/vaults/netcdf/netcdf.c b/sql/backends/monet5/vaults/netcdf/netcdf.c --- a/sql/backends/monet5/vaults/netcdf/netcdf.c +++ b/sql/backends/monet5/vaults/netcdf/netcdf.c @@ -771,25 +771,32 @@ NCDFimportVariable(Client cntxt, MalBlkP GDKfree(fname); /* Get info for variable vname from NetCDF file */ - if ( (retval = nc_inq_varid(ncid, vname, &varid)) ) + if ( (retval = nc_inq_varid(ncid, vname, &varid)) ) { + nc_close(ncid); return createException(MAL, "netcdf.importvar", SQLSTATE(NC000) "Cannot read variable %s: %s", vname, nc_strerror(retval)); - if ( (retval = nc_inq_var(ncid, varid, vname, &vtype, &vndims, vdims, &vnatts))) + } + if ( (retval = nc_inq_var(ncid, varid, vname, &vtype, &vndims, vdims, &vnatts))) { + nc_close(ncid); return createException(MAL, "netcdf.importvar", SQLSTATE(NC000) "Cannot read variable %d : %s", varid, nc_strerror(retval)); + } /* compose 'create table' statement in the buffer */ dname = (char **) GDKzalloc( sizeof(char *) * vndims); - if (dname == NULL) + if (dname == NULL) { + nc_close(ncid); throw(MAL, "netcdf.importvar", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } for (i = 0; i < vndims; i++) { dname[i] = (char *) GDKzalloc(NC_MAX_NAME + 1); if(!dname[i]) { for (j = 0; j < i; j++) GDKfree(dname[j]); GDKfree(dname); + nc_close(ncid); throw(MAL, "netcdf.importvar", SQLSTATE(HY013) MAL_MALLOC_FAIL); } } @@ -800,7 +807,10 @@ NCDFimportVariable(Client cntxt, MalBlkP for (i = 0; i < vndims; i++){ if ((retval = nc_inq_dim(ncid, vdims[i], dname[i], &dlen))) { + for (j = 0; j < vndims; j++) + GDKfree(dname[j]); GDKfree(dname); + nc_close(ncid); return createException(MAL, "netcdf.importvar", SQLSTATE(NC000) "Cannot read dimension %d : %s", vdims[i], nc_strerror(retval)); @@ -822,21 +832,30 @@ NCDFimportVariable(Client cntxt, MalBlkP /* execute 'create table ' */ msg = SQLstatementIntern(cntxt, s, "netcdf.importvar", TRUE, FALSE, NULL); if (msg != MAL_SUCCEED){ + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); + nc_close(ncid); return msg; } /* load variable data */ dim_bids = (bat *)GDKmalloc(sizeof(bat) * vndims); if (dim_bids == NULL){ + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); + nc_close(ncid); throw(MAL, "netcdf.importvar", SQLSTATE(HY013) MAL_MALLOC_FAIL); } msg = NCDFloadVar(&dim_bids, &vbatid, ncid, varid, vtype, vndims, vdims); if ( msg != MAL_SUCCEED ) { + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); GDKfree(dim_bids); + nc_close(ncid); return msg; } @@ -844,40 +863,54 @@ NCDFimportVariable(Client cntxt, MalBlkP aname_sys = toLower(aname); arr_table = mvc_bind_table(m, sch, aname_sys); if (arr_table == NULL){ + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); GDKfree(dim_bids); - return createException(MAL, "netcdf.importvar", SQLSTATE(NC000) "netcdf table %s missing\n", aname_sys); + nc_close(ncid); + throw(MAL, "netcdf.importvar", SQLSTATE(NC000) "netcdf table %s missing\n", aname_sys); } col = mvc_bind_column(m, arr_table, "value"); if (col == NULL){ + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); GDKfree(dim_bids); - return createException(MAL, "netcdf.importvar", SQLSTATE(NC000) "Cannot find column %s.value\n", aname_sys); + nc_close(ncid); + throw(MAL, "netcdf.importvar", SQLSTATE(NC000) "Cannot find column %s.value\n", aname_sys); } vbat = BATdescriptor(vbatid); if(vbat == NULL) { + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); GDKfree(dim_bids); - return createException(MAL, "netcdf.importvar", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + nc_close(ncid); + throw(MAL, "netcdf.importvar", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); } BUN offset; BAT *pos = NULL; if (store->storage_api.claim_tab(m->session->tr, arr_table, BATcount(vbat), &offset, &pos) != LOG_OK) { + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); GDKfree(dim_bids); BBPunfix(vbatid); BBPrelease(vbatid); + nc_close(ncid); throw(MAL, "netcdf.importvar", SQLSTATE(HY013) MAL_MALLOC_FAIL); } if (!isNew(arr_table) && sql_trans_add_dependency_change(m->session->tr, arr_table->base.id, dml) != LOG_OK) { + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); GDKfree(dim_bids); BBPunfix(vbatid); BBPrelease(vbatid); - if (pos) - bat_destroy(pos); + bat_destroy(pos); + nc_close(ncid); throw(MAL, "netcdf.importvar", SQLSTATE(HY013) MAL_MALLOC_FAIL); } store->storage_api.append_col(m->session->tr, col, offset, pos, vbat, BATcount(vbat), TYPE_bat); @@ -889,29 +922,36 @@ NCDFimportVariable(Client cntxt, MalBlkP for (i = 0; i < vndims; i++){ col = mvc_bind_column(m, arr_table, dname[i]); if (col == NULL){ + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); GDKfree(dim_bids); + bat_destroy(pos); + nc_close(ncid); throw(MAL, "netcdf.importvar", SQLSTATE(NC000) "Cannot find column %s.%s\n", aname_sys, dname[i]); } dimbat = BATdescriptor(dim_bids[i]); if(dimbat == NULL) { + for (i = 0; i < vndims; i++) + GDKfree(dname[i]); GDKfree(dname); GDKfree(dim_bids); - return createException(MAL, "netcdf.importvar", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + bat_destroy(pos); + nc_close(ncid); + throw(MAL, "netcdf.importvar", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); } store->storage_api.append_col(m->session->tr, col, offset, pos, dimbat, BATcount(dimbat), TYPE_bat); BBPunfix(dim_bids[i]); /* phys. ref from BATdescriptor */ BBPrelease(dim_bids[i]); /* log. ref. from loadVar */ dimbat = NULL; } - bat_destroy(pos); for (i = 0; i < vndims; i++) - GDKfree(dname[i]); + GDKfree(dname[i]); GDKfree(dname); GDKfree(dim_bids); - + bat_destroy(pos); nc_close(ncid); return msg; } diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c --- a/tools/monetdbe/monetdbe.c +++ b/tools/monetdbe/monetdbe.c @@ -2404,6 +2404,8 @@ remote_cleanup: } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list