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