1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 04:57:45 +00:00

LibAudio: Treat FLAC bps <= wasted_bps as error instead of crash

This can happen with some weird inputs, so instead, return an error; we
need at least one “effective” bit per sample so the bits per sample
cannot be less than or equal to the wasted bits per sample.
This commit is contained in:
kleines Filmröllchen 2023-08-20 14:15:23 +02:00 committed by Andrew Kaster
parent c776ebcaf6
commit dcc3d7bc35

View file

@ -746,7 +746,13 @@ ErrorOr<Vector<i64>, LoaderError> FlacLoaderPlugin::decode_verbatim(FlacSubframe
Vector<i64> decoded;
decoded.ensure_capacity(m_current_frame->sample_count);
VERIFY(subframe.bits_per_sample - subframe.wasted_bits_per_sample != 0);
if (subframe.bits_per_sample <= subframe.wasted_bits_per_sample) {
return LoaderError {
LoaderError::Category::Format,
TRY(m_stream->tell()),
"Effective verbatim bits per sample are zero"sv,
};
}
for (size_t i = 0; i < m_current_frame->sample_count; ++i) {
decoded.unchecked_append(sign_extend(
TRY(bit_input.read_bits<u64>(subframe.bits_per_sample - subframe.wasted_bits_per_sample)),
@ -766,7 +772,13 @@ ErrorOr<void, LoaderError> FlacLoaderPlugin::decode_custom_lpc(Vector<i64>& deco
decoded.ensure_capacity(m_current_frame->sample_count);
VERIFY(subframe.bits_per_sample - subframe.wasted_bits_per_sample != 0);
if (subframe.bits_per_sample <= subframe.wasted_bits_per_sample) {
return LoaderError {
LoaderError::Category::Format,
TRY(m_stream->tell()),
"Effective verbatim bits per sample are zero"sv,
};
}
// warm-up samples
for (auto i = 0; i < subframe.order; ++i) {
decoded.unchecked_append(sign_extend(
@ -825,7 +837,13 @@ ErrorOr<Vector<i64>, LoaderError> FlacLoaderPlugin::decode_fixed_lpc(FlacSubfram
Vector<i64> decoded;
decoded.ensure_capacity(m_current_frame->sample_count);
VERIFY(subframe.bits_per_sample - subframe.wasted_bits_per_sample != 0);
if (subframe.bits_per_sample <= subframe.wasted_bits_per_sample) {
return LoaderError {
LoaderError::Category::Format,
TRY(m_stream->tell()),
"Effective verbatim bits per sample are zero"sv,
};
}
// warm-up samples
for (auto i = 0; i < subframe.order; ++i) {
decoded.unchecked_append(sign_extend(