diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | gst/id3demux/id3v2frames.c | 19 |
2 files changed, 26 insertions, 2 deletions
@@ -1,3 +1,12 @@ +2006-05-10 Jan Schmidt <thaytan@mad.scientist.com> + + * gst/id3demux/id3v2frames.c: (id3v2_genre_fields_to_taglist): + Fix parsing of numeric genre strings some more, by ensuring that + we only try and parse strings that a) Start with '(' and b) Consist + only of digits. + Also, when finding an escaping '((' sequence, bust it back to '(' by + swallowing the first parenthesis + 2006-05-10 Tim-Philipp Müller <tim at centricular dot net> * ext/esd/esdsink.c: (gst_esdsink_finalize), (gst_esdsink_getcaps), diff --git a/gst/id3demux/id3v2frames.c b/gst/id3demux/id3v2frames.c index b97e4d01..832b7b22 100644 --- a/gst/id3demux/id3v2frames.c +++ b/gst/id3demux/id3v2frames.c @@ -622,8 +622,17 @@ id3v2_genre_fields_to_taglist (ID3TagsWorking * work, const gchar * tag_name, gint pos; gboolean found = FALSE; - /* Double parenthesis ends the numeric genres */ - if (tag_str[0] == '(' && tag_str[1] == '(') + /* Double parenthesis ends the numeric genres, but we need + * to swallow the first one so we actually output '(' */ + if (tag_str[0] == '(' && tag_str[1] == '(') { + tag_str++; + len--; + break; + } + + /* If the first char is not a parenthesis, then stop + * looking for parenthesised genre strings */ + if (tag_str[0] != '(') break; for (pos = 1; pos < len; pos++) { @@ -640,6 +649,12 @@ id3v2_genre_fields_to_taglist (ID3TagsWorking * work, const gchar * tag_name, found = TRUE; break; } + + /* If we encounter a non-digit while searching for a closing + * parenthesis, we should not try and interpret this as a + * numeric genre string */ + if (!g_ascii_isdigit (tag_str[pos])) + break; } if (!found) break; /* There was no closing parenthesis */ |