Changeset: 041e2f015b9a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=041e2f015b9a
Modified Files:
        common/stream/stream.c
        sql/server/rel_updates.c
Branch: Dec2016
Log Message:

Plug a few memory leaks.


diffs (148 lines):

diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -4712,11 +4712,11 @@ typedef struct {
        char filler;
        // state
        size_t line_len;
-       char* in_buf;
-       char* out_buf;
+       char *in_buf;
+       char *out_buf;
        size_t out_buf_start;
        size_t out_buf_remaining;
-       char* nl_buf;
+       char nl_buf[1];
 } stream_fwf_data;
 
 
@@ -4726,10 +4726,11 @@ stream_fwf_read(stream *s, void *buf, si
        stream_fwf_data *fsd;
        size_t to_write = cnt;
        size_t buf_written = 0;
-       if (strcmp(s->name, STREAM_FWF_NAME) != 0 || elmsize != 1) {
+
+       fsd = (stream_fwf_data*) s->stream_data.p;
+       if (fsd == NULL || elmsize != 1) {
                return -1;
        }
-       fsd = (stream_fwf_data*) s->stream_data.p;
 
        while (to_write > 0) {
                // input conversion
@@ -4767,12 +4768,12 @@ stream_fwf_read(stream *s, void *buf, si
 
                // now we know something is in output_buf so deliver it
                if (fsd->out_buf_remaining <= to_write) {
-                       memcpy((char*)buf + buf_written, fsd->out_buf + 
fsd->out_buf_start, fsd->out_buf_remaining);
+                       memcpy((char *) buf + buf_written, fsd->out_buf + 
fsd->out_buf_start, fsd->out_buf_remaining);
                        to_write -= fsd->out_buf_remaining;
                        buf_written += fsd->out_buf_remaining;
                        fsd->out_buf_remaining = 0;
                } else {
-                       memcpy((char*) buf + buf_written, fsd->out_buf + 
fsd->out_buf_start, to_write);
+                       memcpy((char *) buf + buf_written, fsd->out_buf + 
fsd->out_buf_start, to_write);
                        fsd->out_buf_start += to_write;
                        fsd->out_buf_remaining -= to_write;
                        buf_written += to_write;
@@ -4786,25 +4787,35 @@ stream_fwf_read(stream *s, void *buf, si
 static void
 stream_fwf_close(stream *s)
 {
-       if (strcmp(s->name, STREAM_FWF_NAME) == 0) {
+       stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p;
+
+       if (fsd != NULL) {
                stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p;
                mnstr_close(fsd->s);
+               mnstr_destroy(fsd->s);
                free(fsd->widths);
                free(fsd->in_buf);
                free(fsd->out_buf);
-               free(fsd->nl_buf);
                free(fsd);
+               s->stream_data.p = NULL;
        }
-       // FIXME destroy(s);
 }
 
-stream*
+static void
+stream_fwf_destroy(stream *s)
+{
+       stream_fwf_close(s);
+       destroy(s);
+}
+
+stream *
 stream_fwf_create (stream *s, size_t num_fields, size_t *widths, char filler)
 {
        stream *ns;
        stream_fwf_data *fsd = malloc(sizeof(stream_fwf_data));
        size_t i, out_buf_len;
-       if (!fsd) {
+
+       if (fsd == NULL) {
                return NULL;
        }
        fsd->s = s;
@@ -4816,34 +4827,27 @@ stream_fwf_create (stream *s, size_t num
                fsd->line_len += widths[i];
        }
        fsd->in_buf = malloc(fsd->line_len);
-       if (!fsd->in_buf) {
+       if (fsd->in_buf == NULL) {
                free(fsd);
                return NULL;
        }
        out_buf_len = fsd->line_len * 3;
        fsd->out_buf = malloc(out_buf_len);
-       if (!fsd->out_buf) {
+       if (fsd->out_buf == NULL) {
                free(fsd->in_buf);
                free(fsd);
                return NULL;
        }
        fsd->out_buf_remaining = 0;
-       fsd->nl_buf = malloc(1);
-       if (!fsd->nl_buf) {
+       if ((ns = create_stream(STREAM_FWF_NAME)) == NULL) {
                free(fsd->in_buf);
                free(fsd->out_buf);
                free(fsd);
                return NULL;
        }
-       if ((ns = create_stream(STREAM_FWF_NAME)) == NULL) {
-               free(fsd->in_buf);
-               free(fsd->out_buf);
-               free(fsd->nl_buf);
-               free(fsd);
-               return NULL;
-       }
        ns->read = stream_fwf_read;
        ns->close = stream_fwf_close;
+       ns->destroy = stream_fwf_destroy;
        ns->write = NULL;
        ns->flush = NULL;
        ns->access = ST_READ;
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -1173,7 +1173,7 @@ rel_import(mvc *sql, sql_table *t, char 
        sql_exp *import;
        sql_schema *sys = mvc_bind_schema(sql, "sys");
        sql_subfunc *f = sql_find_func(sql->sa, sys, "copyfrom", 10, F_UNION, 
NULL);
-       char* fwf_string = NULL;
+       char *fwf_string = NULL;
        
        if (!f) /* we do expect copyfrom to be there */
                return NULL;
@@ -1189,7 +1189,7 @@ rel_import(mvc *sql, sql_table *t, char 
        if (fwf_widths && dlist_length(fwf_widths) > 0) {
                dnode *dn;
                int ncol = 0;
-               char* fwf_string_cur = fwf_string = GDKmalloc(20 * 
dlist_length(fwf_widths) + 1); // a 64 bit int needs 19 characters in decimal 
representation plus the separator
+               char *fwf_string_cur = fwf_string = sa_alloc(sql->sa, 20 * 
dlist_length(fwf_widths) + 1); // a 64 bit int needs 19 characters in decimal 
representation plus the separator
 
                if (!fwf_string) 
                        return NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to