forked from len0rd/rockbox
Fix FS#11955. ID3 tag parser was broken since r29349. Trimming strings must be done in the helper functions, not outside.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29372 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
aa6a66f984
commit
588b892785
1 changed files with 10 additions and 11 deletions
|
|
@ -266,6 +266,9 @@ static int parseyearnum( struct mp3entry* entry, char* tag, int bufferpos )
|
||||||
/* parse numeric genre from string, version 2.2 and 2.3 */
|
/* parse numeric genre from string, version 2.2 and 2.3 */
|
||||||
static int parsegenre( struct mp3entry* entry, char* tag, int bufferpos )
|
static int parsegenre( struct mp3entry* entry, char* tag, int bufferpos )
|
||||||
{
|
{
|
||||||
|
/* Use bufferpos to hold current position in entry->id3v2buf. */
|
||||||
|
bufferpos = tag - entry->id3v2buf;
|
||||||
|
|
||||||
if(entry->id3version >= ID3_VER_2_4) {
|
if(entry->id3version >= ID3_VER_2_4) {
|
||||||
/* In version 2.4 and up, there are no parentheses, and the genre frame
|
/* In version 2.4 and up, there are no parentheses, and the genre frame
|
||||||
is a list of strings, either numbers or text. */
|
is a list of strings, either numbers or text. */
|
||||||
|
|
@ -273,19 +276,19 @@ static int parsegenre( struct mp3entry* entry, char* tag, int bufferpos )
|
||||||
/* Is it a number? */
|
/* Is it a number? */
|
||||||
if(isdigit(tag[0])) {
|
if(isdigit(tag[0])) {
|
||||||
entry->genre_string = id3_get_num_genre(atoi( tag ));
|
entry->genre_string = id3_get_num_genre(atoi( tag ));
|
||||||
return tag - entry->id3v2buf;
|
return bufferpos;
|
||||||
} else {
|
} else {
|
||||||
entry->genre_string = tag;
|
entry->genre_string = tag;
|
||||||
return bufferpos;
|
return bufferpos + strlen(tag) + 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if( tag[0] == '(' && tag[1] != '(' ) {
|
if( tag[0] == '(' && tag[1] != '(' ) {
|
||||||
entry->genre_string = id3_get_num_genre(atoi( tag + 1 ));
|
entry->genre_string = id3_get_num_genre(atoi( tag + 1 ));
|
||||||
return tag - entry->id3v2buf;
|
return bufferpos;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
entry->genre_string = tag;
|
entry->genre_string = tag;
|
||||||
return bufferpos;
|
return bufferpos + strlen(tag) + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -360,7 +363,7 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
|
||||||
/* At least part of the value was read, so we can safely try to
|
/* At least part of the value was read, so we can safely try to
|
||||||
* parse it */
|
* parse it */
|
||||||
value = tag + desc_len + 1;
|
value = tag + desc_len + 1;
|
||||||
value_len = bufferpos - (tag - entry->id3v2buf);
|
value_len = strlen(value) + 1;
|
||||||
|
|
||||||
if (!strcasecmp(tag, "ALBUM ARTIST")) {
|
if (!strcasecmp(tag, "ALBUM ARTIST")) {
|
||||||
strlcpy(tag, value, value_len);
|
strlcpy(tag, value, value_len);
|
||||||
|
|
@ -368,6 +371,8 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
|
||||||
#if CONFIG_CODEC == SWCODEC
|
#if CONFIG_CODEC == SWCODEC
|
||||||
} else {
|
} else {
|
||||||
value_len = parse_replaygain(tag, value, entry, tag, value_len);
|
value_len = parse_replaygain(tag, value, entry, tag, value_len);
|
||||||
|
#else
|
||||||
|
value_len = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1039,12 +1044,6 @@ void setid3v2title(int fd, struct mp3entry *entry)
|
||||||
if( tr->ppFunc )
|
if( tr->ppFunc )
|
||||||
bufferpos = tr->ppFunc(entry, tag, bufferpos);
|
bufferpos = tr->ppFunc(entry, tag, bufferpos);
|
||||||
|
|
||||||
/* Trim. Take into account that multiple string contents will
|
|
||||||
* only be displayed up to their first null termination. All
|
|
||||||
* content after this null termination is obsolete and can be
|
|
||||||
* overwritten. */
|
|
||||||
bufferpos -= (bytesread - strlen(tag));
|
|
||||||
|
|
||||||
/* Seek to the next frame */
|
/* Seek to the next frame */
|
||||||
if(framelen < totframelen)
|
if(framelen < totframelen)
|
||||||
lseek(fd, totframelen - framelen, SEEK_CUR);
|
lseek(fd, totframelen - framelen, SEEK_CUR);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue