diff --git a/taglib/ogg/vorbis/vorbisproperties.cpp b/taglib/ogg/vorbis/vorbisproperties.cpp index 42ee3d3b..e57460c5 100644 --- a/taglib/ogg/vorbis/vorbisproperties.cpp +++ b/taglib/ogg/vorbis/vorbisproperties.cpp @@ -25,6 +25,8 @@ #include "vorbisproperties.h" +#include + #include "tstring.h" #include "tdebug.h" #include "oggpageheader.h" @@ -165,8 +167,18 @@ void Vorbis::Properties::read(File *file) for (unsigned int i = 0; i < 3; ++i) { fileLengthWithoutOverhead -= file->packet(i).size(); } - d->length = static_cast(length + 0.5); - d->bitrate = static_cast(static_cast(fileLengthWithoutOverhead) * 8.0 / length + 0.5); + // The granule positions are 64 bit and the sample rate is read from the + // file, so the millisecond length can land outside int, and a short + // stream at a high rate does the same to the bitrate. Converting a + // double the destination type cannot represent is undefined, so leave + // the field at its default instead. + if(length > 0.0 && length < static_cast(std::numeric_limits::max())) { + d->length = static_cast(length + 0.5); + + const double bitrate = static_cast(fileLengthWithoutOverhead) * 8.0 / length; + if(bitrate >= 0.0 && bitrate < static_cast(std::numeric_limits::max())) + d->bitrate = static_cast(bitrate + 0.5); + } } } else {