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

Reply via email to