summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-01-03 23:28:51 +0100
committerMax Kellermann <max@duempel.org>2009-01-03 23:28:51 +0100
commit149f4e10cf339f90cea05b588b0099febf097b67 (patch)
tree0f810ebe7e976b18e433f2e1c5b8edebc11fa2c8
parent77b32addf1639cf94475b40b1b9ed8990b9f5858 (diff)
decoder_api: moved code to do_send_tag(), free temporary tag
This patch fixes a minor memory leak: when decoder_tag() attempted to send a merged tag object (created by tag_add_stream_tags()), and was interrupted by a decoder command, it did not free the temporary merged tag object.
-rw-r--r--NEWS1
-rw-r--r--src/decoder_api.c24
2 files changed, 18 insertions, 7 deletions
diff --git a/NEWS b/NEWS
index 4be474d9e..bb764daca 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@ ver 0.15 - (200?/??/??)
* support logging to syslog
* fall back to XDG music directory if no music_directory is configured
* failure to read the state file is non-fatal
+* fix minor memory leak in decoder_tag()
ver 0.14 (2008/12/25)
* audio outputs:
diff --git a/src/decoder_api.c b/src/decoder_api.c
index eba2387c3..0f25daadb 100644
--- a/src/decoder_api.c
+++ b/src/decoder_api.c
@@ -183,6 +183,18 @@ need_chunks(struct input_stream *is, bool wait)
return DECODE_COMMAND_NONE;
}
+static enum decoder_command
+do_send_tag(struct input_stream *is, const struct tag *tag)
+{
+ while (!music_pipe_tag(tag)) {
+ enum decoder_command cmd = need_chunks(is, true);
+ if (cmd != DECODE_COMMAND_NONE)
+ return cmd;
+ }
+
+ return DECODE_COMMAND_NONE;
+}
+
enum decoder_command
decoder_data(struct decoder *decoder,
struct input_stream *is,
@@ -288,22 +300,20 @@ decoder_tag(G_GNUC_UNUSED struct decoder *decoder, struct input_stream *is,
const struct tag *tag)
{
struct tag *tag2 = is != NULL ? tag_add_stream_tags(tag, is) : NULL;
+ enum decoder_command cmd;
assert(dc.state == DECODE_STATE_DECODE);
if (tag2 != NULL)
tag = tag2;
- while (!music_pipe_tag(tag)) {
- enum decoder_command cmd = need_chunks(is, true);
- if (cmd != DECODE_COMMAND_NONE)
- return cmd;
- }
+ cmd = do_send_tag(is, tag);
if (tag2 != NULL)
tag_free(tag2);
- decoder->stream_tag_sent = true;
+ if (cmd == DECODE_COMMAND_NONE)
+ decoder->stream_tag_sent = true;
- return DECODE_COMMAND_NONE;
+ return cmd;
}