aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS8
-rw-r--r--src/decoder/mad_decoder_plugin.c30
-rw-r--r--src/input/mms_input_plugin.c3
3 files changed, 36 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index 3e280ee99..173f963e7 100644
--- a/NEWS
+++ b/NEWS
@@ -101,6 +101,14 @@ ver 0.16 (20??/??/??)
* added libwrap support
+ver 0.15.10 (2010/05/30)
+* input:
+ - mms: fix memory leak in error handler
+ - mms: initialize the "eof" attribute
+* decoders:
+ - mad: properly calculate ID3 size without libid3tag
+
+
ver 0.15.9 (2010/03/21)
* decoders:
- mad: fix crash when seeking at end of song
diff --git a/src/decoder/mad_decoder_plugin.c b/src/decoder/mad_decoder_plugin.c
index 573afc975..32e35f113 100644
--- a/src/decoder/mad_decoder_plugin.c
+++ b/src/decoder/mad_decoder_plugin.c
@@ -468,7 +468,27 @@ static void mp3_parse_id3(struct mp3_data *data, size_t tagsize,
/* This code is enabled when libid3tag is disabled. Instead
of parsing the ID3 frame, it just skips it. */
- mad_stream_skip(&data->stream, tagsize);
+ size_t count = data->stream.bufend - data->stream.this_frame;
+
+ if (tagsize <= count) {
+ mad_stream_skip(&data->stream, tagsize);
+ } else {
+ mad_stream_skip(&data->stream, count);
+
+ while (count < tagsize) {
+ size_t len = tagsize - count;
+ char ignored[1024];
+ if (len > sizeof(ignored))
+ len = sizeof(ignored);
+
+ len = decoder_read(data->decoder, data->input_stream,
+ ignored, len);
+ if (len == 0)
+ break;
+ else
+ count += len;
+ }
+ }
#endif
}
@@ -476,16 +496,16 @@ static void mp3_parse_id3(struct mp3_data *data, size_t tagsize,
/**
* This function emulates libid3tag when it is disabled. Instead of
* doing a real analyzation of the frame, it just checks whether the
- * frame begins with the string "ID3". If so, it returns the full
- * length.
+ * frame begins with the string "ID3". If so, it returns the length
+ * of the ID3 frame.
*/
static signed long
id3_tag_query(const void *p0, size_t length)
{
const char *p = p0;
- return length > 3 && memcmp(p, "ID3", 3) == 0
- ? length
+ return length >= 10 && memcmp(p, "ID3", 3) == 0
+ ? (p[8] << 7) + p[9] + 10
: 0;
}
#endif /* !HAVE_ID3TAG */
diff --git a/src/input/mms_input_plugin.c b/src/input/mms_input_plugin.c
index 2fe9b6bb2..834d111b8 100644
--- a/src/input/mms_input_plugin.c
+++ b/src/input/mms_input_plugin.c
@@ -60,10 +60,13 @@ input_mms_open(const char *url, GError **error_r)
m->mms = mmsx_connect(NULL, NULL, url, 128 * 1024);
if (m->mms == NULL) {
+ g_free(m);
g_set_error(error_r, mms_quark(), 0, "mmsx_connect() failed");
return NULL;
}
+ m->eof = false;
+
/* XX is this correct? at least this selects the ffmpeg
decoder, which seems to work fine*/
m->base.mime = g_strdup("audio/x-ms-wma");