1st part of fix for FS#10637. Correction of mpc header parsing.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24408 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Andree Buschmann 2010-01-31 11:43:42 +00:00
parent 4c96bb54c6
commit db4d7a313e
2 changed files with 12 additions and 8 deletions

View file

@ -223,15 +223,17 @@ mpc_streaminfo_read(mpc_streaminfo * si, mpc_reader * r)
#endif #endif
si->stream_version = HeaderData[0] >> 24; si->stream_version = HeaderData[0] >> 24;
// stream version 8
if ((si->stream_version & 15) >= 8) {
return ERROR_CODE_INVALIDSV;
}
// stream version 7 // stream version 7
else if ((si->stream_version & 15) == 7) { if ((si->stream_version & 15) == 7) {
Error = streaminfo_read_header_sv7(si, HeaderData); Error = streaminfo_read_header_sv7(si, HeaderData);
if (Error != ERROR_CODE_OK) return Error; if (Error != ERROR_CODE_OK) return Error;
} else {
// only sv7 allowed with "MP+" signature
return ERROR_CODE_INVALIDSV;
} }
} else if (memcmp(HeaderData, "MPCK", 4) == 0) {
// stream version 8 uses "MPCK" signature
return ERROR_CODE_INVALIDSV;
} else { } else {
#ifdef MPC_SUPPORT_SV456 #ifdef MPC_SUPPORT_SV456
#ifndef MPC_LITTLE_ENDIAN #ifndef MPC_LITTLE_ENDIAN

View file

@ -66,9 +66,7 @@ bool get_musepack_metadata(int fd, struct mp3entry *id3)
header[0] = letoh32(header[0]); header[0] = letoh32(header[0]);
streamversion = (header[0] >> 24) & 15; streamversion = (header[0] >> 24) & 15;
if (streamversion >= 8) { if (streamversion == 7) {
return false; /* SV8 or higher don't exist yet, so no support */
} else if (streamversion == 7) {
unsigned int gapless = (header[5] >> 31) & 0x0001; unsigned int gapless = (header[5] >> 31) & 0x0001;
unsigned int last_frame_samples = (header[5] >> 20) & 0x07ff; unsigned int last_frame_samples = (header[5] >> 20) & 0x07ff;
unsigned int bufused = 0; unsigned int bufused = 0;
@ -82,7 +80,11 @@ bool get_musepack_metadata(int fd, struct mp3entry *id3)
bufused = set_replaygain(id3, false, header[3], bufused); bufused = set_replaygain(id3, false, header[3], bufused);
bufused = set_replaygain(id3, true, header[4], bufused); bufused = set_replaygain(id3, true, header[4], bufused);
} else {
return false; /* only SV7 is allowed within a "MP+" signature */
} }
} else if (!memcmp(header, "MPCK", 4)) { /* Compare to sig "MPCK" */
return false; /* SV8 is not supported yet */
} else { } else {
return false; /* SV4-6 is not supported anymore */ return false; /* SV4-6 is not supported anymore */
} }