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");