From df6c8e15d1d845ab222e9fff2e826d6c8575ea75 Mon Sep 17 00:00:00 2001 From: manuaudio Date: Sat, 15 Aug 2026 01:37:28 -0700 Subject: [PATCH] MPC: do not convert an out of range length to int Fifth instance of the same shape, in readSV8: const auto length = static_cast(frameCount) * 1000.0 / d->sampleRate; d->length = static_cast(length + 0.5); d->bitrate = static_cast(static_cast(streamLength) * 8.0 / length + 0.5); frameCount is sampleFrames minus begSilence, both read from the file, so the millisecond figure can land outside int: taglib/mpc/mpcproperties.cpp:244:39: runtime error: 4.18294e+17 is outside the range of representable values of type 'int' The bitrate on the next line goes the same way when length is small, so it is guarded too. One report before, none after, and the .mpc files in tests/data report identical properties. Turned up independently from two different seed files, sv8_header.mpc and zerodiv.mpc. Assisted-By: Claude Code (Claude Opus 5) --- taglib/mpc/mpcproperties.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/taglib/mpc/mpcproperties.cpp b/taglib/mpc/mpcproperties.cpp index ba5c47e5..144473ed 100644 --- a/taglib/mpc/mpcproperties.cpp +++ b/taglib/mpc/mpcproperties.cpp @@ -240,9 +240,18 @@ void MPC::Properties::readSV8(File *file, offset_t streamLength) if(const auto frameCount = d->sampleFrames - begSilence; frameCount > 0 && d->sampleRate > 0) { + // frameCount comes from counts in the file, so the millisecond figure can land + // outside int, and converting a double the destination type cannot represent is + // undefined. Leave the fields at their defaults rather than converting. const auto length = static_cast(frameCount) * 1000.0 / d->sampleRate; - d->length = static_cast(length + 0.5); - d->bitrate = static_cast(static_cast(streamLength) * 8.0 / length + 0.5); + + if(length > 0.0 && length < static_cast(std::numeric_limits::max())) { + d->length = static_cast(length + 0.5); + + const double bitrate = static_cast(streamLength) * 8.0 / length; + if(bitrate >= 0.0 && bitrate < static_cast(std::numeric_limits::max())) + d->bitrate = static_cast(bitrate + 0.5); + } } } else if (packetType == "RG") {