diff options
author | Max Kellermann <max@duempel.org> | 2011-07-03 14:57:56 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2011-07-03 14:57:56 +0200 |
commit | 6aa6a9c2727c863239d6396a40a781e98e922565 (patch) | |
tree | e67b32b7cf6cffdfc11f4a76db2d9ae190469453 /src | |
parent | 8d1c7ca2065444dfe2da432a30c95782e3ead48d (diff) | |
download | mpd-6aa6a9c2727c863239d6396a40a781e98e922565.tar.gz mpd-6aa6a9c2727c863239d6396a40a781e98e922565.tar.xz mpd-6aa6a9c2727c863239d6396a40a781e98e922565.zip |
decoder/flac: validate the sample rate when scanning the tag
Don't calculate the song duration when the sample rate is 0 (division
by zero crash).
Diffstat (limited to 'src')
-rw-r--r-- | src/decoder/flac_metadata.c | 3 | ||||
-rw-r--r-- | src/decoder/flac_metadata.h | 3 |
2 files changed, 5 insertions, 1 deletions
diff --git a/src/decoder/flac_metadata.c b/src/decoder/flac_metadata.c index f2f2f954d..5b94fd426 100644 --- a/src/decoder/flac_metadata.c +++ b/src/decoder/flac_metadata.c @@ -224,7 +224,8 @@ flac_tag_apply_metadata(struct tag *tag, const char *track, break; case FLAC__METADATA_TYPE_STREAMINFO: - tag->time = flac_duration(&block->data.stream_info); + if (block->data.stream_info.sample_rate > 0) + tag->time = flac_duration(&block->data.stream_info); break; default: diff --git a/src/decoder/flac_metadata.h b/src/decoder/flac_metadata.h index 06e691d1d..e52b0fb82 100644 --- a/src/decoder/flac_metadata.h +++ b/src/decoder/flac_metadata.h @@ -20,6 +20,7 @@ #ifndef MPD_FLAC_METADATA_H #define MPD_FLAC_METADATA_H +#include <assert.h> #include <stdbool.h> #include <FLAC/metadata.h> @@ -29,6 +30,8 @@ struct replay_gain_info; static inline unsigned flac_duration(const FLAC__StreamMetadata_StreamInfo *stream_info) { + assert(stream_info->sample_rate > 0); + return (stream_info->total_samples + stream_info->sample_rate - 1) / stream_info->sample_rate; } |