mirror of
https://github.com/taglib/taglib.git
synced 2026-08-27 12:47:01 -04:00
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:
@@ -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") {
|
||||
|
||||
Reference in New Issue
Block a user