From 32b53359fdd4d755c7fe5d789f007631789b94fa Mon Sep 17 00:00:00 2001 From: Buschel Date: Sun, 31 Jan 2010 11:43:42 +0000 Subject: [PATCH] 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 --- apps/codecs/libmusepack/streaminfo.c | 12 +++++++----- apps/metadata/mpc.c | 8 +++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/codecs/libmusepack/streaminfo.c b/apps/codecs/libmusepack/streaminfo.c index d9c925dbf..3edf50a5e 100644 --- a/apps/codecs/libmusepack/streaminfo.c +++ b/apps/codecs/libmusepack/streaminfo.c @@ -223,15 +223,17 @@ mpc_streaminfo_read(mpc_streaminfo * si, mpc_reader * r) #endif si->stream_version = HeaderData[0] >> 24; - // stream version 8 - if ((si->stream_version & 15) >= 8) { - return ERROR_CODE_INVALIDSV; - } // stream version 7 - else if ((si->stream_version & 15) == 7) { + if ((si->stream_version & 15) == 7) { Error = streaminfo_read_header_sv7(si, HeaderData); 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 { #ifdef MPC_SUPPORT_SV456 #ifndef MPC_LITTLE_ENDIAN diff --git a/apps/metadata/mpc.c b/apps/metadata/mpc.c index e20ac3e8a..3f8907a93 100644 --- a/apps/metadata/mpc.c +++ b/apps/metadata/mpc.c @@ -66,9 +66,7 @@ bool get_musepack_metadata(int fd, struct mp3entry *id3) header[0] = letoh32(header[0]); streamversion = (header[0] >> 24) & 15; - if (streamversion >= 8) { - return false; /* SV8 or higher don't exist yet, so no support */ - } else if (streamversion == 7) { + if (streamversion == 7) { unsigned int gapless = (header[5] >> 31) & 0x0001; unsigned int last_frame_samples = (header[5] >> 20) & 0x07ff; 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, 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 { return false; /* SV4-6 is not supported anymore */ } -- 2.11.4.GIT