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