input: Only use header buffer for modules that need it.

The buffer was leaking into modules that didn't ask for it.
This commit is contained in:
Bert Vermeulen 2014-08-20 00:40:25 +02:00
parent 0a4d68f74b
commit 115fbe9410
1 changed files with 15 additions and 12 deletions

View File

@ -376,7 +376,7 @@ SR_API const struct sr_input *sr_input_scan_file(const char *filename)
struct sr_input *in;
const struct sr_input_module *imod;
GHashTable *meta;
GString *buf;
GString *header_buf;
struct stat st;
unsigned int midx, m, i;
int fd;
@ -405,8 +405,10 @@ SR_API const struct sr_input *sr_input_scan_file(const char *filename)
/* TODO: MIME type */
in = NULL;
buf = NULL;
header_buf = g_string_sized_new(128);
for (i = 0; input_module_list[i]; i++) {
g_string_truncate(header_buf, 0);
imod = input_module_list[i];
if (!imod->metadata[0]) {
/* Module has no metadata for matching so will take
@ -420,28 +422,30 @@ SR_API const struct sr_input *sr_input_scan_file(const char *filename)
meta = g_hash_table_new(NULL, NULL);
for (m = 0; m < sizeof(imod->metadata); m++) {
mitem = imod->metadata[m] & ~SR_INPUT_META_REQUIRED;
if (!mitem)
/* Metadata list is 0-terminated. */
break;
if (mitem == SR_INPUT_META_FILENAME)
g_hash_table_insert(meta, GINT_TO_POINTER(mitem),
(gpointer)filename);
else if (mitem == SR_INPUT_META_FILESIZE)
else if (mitem == SR_INPUT_META_FILESIZE) {
sr_dbg("inserting fs %d", st.st_size);
g_hash_table_insert(meta, GINT_TO_POINTER(mitem),
GINT_TO_POINTER(st.st_size));
else if (mitem == SR_INPUT_META_HEADER) {
buf = g_string_sized_new(128);
} else if (mitem == SR_INPUT_META_HEADER) {
if ((fd = open(filename, O_RDONLY)) < 0) {
sr_err("%s", strerror(errno));
return NULL;
}
size = read(fd, buf->str, 128);
buf->len = size;
size = read(fd, header_buf->str, 128);
header_buf->len = size;
close(fd);
if (size <= 0) {
g_string_free(buf, TRUE);
g_string_free(header_buf, TRUE);
sr_err("%s", strerror(errno));
return NULL;
}
g_hash_table_insert(meta, GINT_TO_POINTER(mitem), buf);
g_string_free(buf, TRUE);
g_hash_table_insert(meta, GINT_TO_POINTER(mitem), header_buf);
}
}
if (g_hash_table_size(meta) == 0) {
@ -459,8 +463,7 @@ SR_API const struct sr_input *sr_input_scan_file(const char *filename)
g_string_insert_len(in->buf, 0, buf->str, buf->len);
break;
}
if (!in && buf)
g_string_free(buf, TRUE);
g_string_free(header_buf, TRUE);
return in;
}