decoder/dsf: don't play junk at the end of the "data" chunk

This commit is contained in:
Max Kellermann 2013-10-28 23:01:13 +01:00
parent 9dcbd005f0
commit 4728735acf
2 changed files with 10 additions and 1 deletions

1
NEWS
View File

@ -15,6 +15,7 @@ ver 0.18 (2012/??/??)
- lastfm: remove defunct Last.fm support - lastfm: remove defunct Last.fm support
* decoder: * decoder:
- adplug: new decoder plugin using libadplug - adplug: new decoder plugin using libadplug
- dsf: don't play junk at the end of the "data" chunk
- ffmpeg: drop support for pre-0.8 ffmpeg - ffmpeg: drop support for pre-0.8 ffmpeg
- flac: require libFLAC 1.2 or newer - flac: require libFLAC 1.2 or newer
- flac: support FLAC files inside archives - flac: support FLAC files inside archives

View File

@ -156,12 +156,20 @@ dsf_read_metadata(Decoder *decoder, InputStream &is,
data_size -= sizeof(data_chunk); data_size -= sizeof(data_chunk);
metadata->chunk_size = data_size;
/* data_size cannot be bigger or equal to total file size */ /* data_size cannot be bigger or equal to total file size */
const uint64_t size = (uint64_t)is.GetSize(); const uint64_t size = (uint64_t)is.GetSize();
if (data_size >= size) if (data_size >= size)
return false; return false;
/* use the sample count from the DSF header as the upper
bound, because some DSF files contain junk at the end of
the "data" chunk */
const uint64_t samplecnt = dsf_fmt_chunk.scnt.Read();
const uint64_t playable_size = samplecnt * 2 / 8;
if (data_size > playable_size)
data_size = playable_size;
metadata->chunk_size = data_size;
metadata->channels = (unsigned) dsf_fmt_chunk.channelnum; metadata->channels = (unsigned) dsf_fmt_chunk.channelnum;
metadata->sample_rate = samplefreq; metadata->sample_rate = samplefreq;
#ifdef HAVE_ID3TAG #ifdef HAVE_ID3TAG