MPC: do not convert an out of range length to int

Fifth instance of the same shape, in readSV8:

    const auto length = static_cast<double>(frameCount) * 1000.0 / d->sampleRate;
    d->length  = static_cast<int>(length + 0.5);
    d->bitrate = static_cast<int>(static_cast<double>(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)
This commit is contained in:
manuaudio
2026-08-15 17:52:56 +02:00
committed by Urs Fleisch
parent c767a55744
commit df6c8e15d1
+11 -2
View File
@@ -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<double>(frameCount) * 1000.0 / d->sampleRate;
d->length = static_cast<int>(length + 0.5);
d->bitrate = static_cast<int>(static_cast<double>(streamLength) * 8.0 / length + 0.5);
if(length > 0.0 && length < static_cast<double>(std::numeric_limits<int>::max())) {
d->length = static_cast<int>(length + 0.5);
const double bitrate = static_cast<double>(streamLength) * 8.0 / length;
if(bitrate >= 0.0 && bitrate < static_cast<double>(std::numeric_limits<int>::max()))
d->bitrate = static_cast<int>(bitrate + 0.5);
}
}
}
else if (packetType == "RG") {