aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/decoder/mad_plugin.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/decoder/mad_plugin.c b/src/decoder/mad_plugin.c
index 7cc78a0d2..1bda418e0 100644
--- a/src/decoder/mad_plugin.c
+++ b/src/decoder/mad_plugin.c
@@ -425,7 +425,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;
+ if (len > sizeof(buffer))
+ len = sizeof(buffer);
+
+ char ignored[1024];
+ len = decoder_read(data->decoder, data->input_stream,
+ ignored, len);
+ if (len == 0)
+ break;
+ else
+ count += len;
+ }
+ }
#endif
}
@@ -433,16 +453,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 */