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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list