From d6c2b83468f1c50d1e4f933a3e69d62c4a3191cc Mon Sep 17 00:00:00 2001 From: Nima Woods Date: Thu, 23 Apr 2026 17:40:55 +0200 Subject: [PATCH] add safety checks to BiquadFilterEffectCommand to prevent SIGSEGV --- .../renderer/command/command_generator.cpp | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/audio_core/renderer/command/command_generator.cpp b/src/audio_core/renderer/command/command_generator.cpp index 44f2665b35..e2b90b27b2 100644 --- a/src/audio_core/renderer/command/command_generator.cpp +++ b/src/audio_core/renderer/command/command_generator.cpp @@ -367,18 +367,39 @@ void CommandGenerator::GenerateBiquadFilterEffectCommand(const s16 buffer_offset EffectInfoBase::ParameterState param_state{}; s8 channel_count = 0; + // Safety check for buffer_offset to prevent SIGSEGV + if (buffer_offset < 0 || buffer_offset >= render_context.mix_buffer_count) { + LOG_ERROR(Service_Audio, "Invalid buffer_offset {} for BiquadFilter, mix_buffer_count {}", + buffer_offset, render_context.mix_buffer_count); + return; + } + if (render_context.behavior->IsEffectInfoVersion2Supported()) { const auto* parameter = reinterpret_cast(effect_info.GetParameter()); + if (parameter == nullptr) { + LOG_ERROR(Service_Audio, "BiquadFilter parameter is nullptr"); + return; + } param_state = parameter->state; channel_count = parameter->channel_count; } else { const auto* parameter = reinterpret_cast(effect_info.GetParameter()); + if (parameter == nullptr) { + LOG_ERROR(Service_Audio, "BiquadFilter parameter is nullptr"); + return; + } param_state = parameter->state; channel_count = parameter->channel_count; } + // Safety check for channel_count to prevent buffer overflows + if (channel_count < 0 || channel_count > 6) { + LOG_ERROR(Service_Audio, "Invalid channel_count {} for BiquadFilter", channel_count); + return; + } + if (channel_count > 0 && param_state <= EffectInfoBase::ParameterState::Updated) { if (effect_info.IsEnabled()) { bool needs_init{false}; @@ -399,13 +420,23 @@ void CommandGenerator::GenerateBiquadFilterEffectCommand(const s16 buffer_offset render_context.behavior->UseBiquadFilterFloatProcessing(); for (s8 channel = 0; channel < channel_count; channel++) { - command_buffer.GenerateBiquadFilterCommand(node_id, effect_info, buffer_offset, channel, - needs_init, use_float_processing); + try { + command_buffer.GenerateBiquadFilterCommand(node_id, effect_info, buffer_offset, channel, + needs_init, use_float_processing); + } catch (...) { + LOG_ERROR(Service_Audio, "Exception in GenerateBiquadFilterCommand for channel {}", channel); + return; + } } } else { for (s8 channel = 0; channel < channel_count; channel++) { - command_buffer.GenerateCopyMixBufferCommand(node_id, effect_info, buffer_offset, - channel); + try { + command_buffer.GenerateCopyMixBufferCommand(node_id, effect_info, buffer_offset, + channel); + } catch (...) { + LOG_ERROR(Service_Audio, "Exception in GenerateCopyMixBufferCommand for channel {}", channel); + return; + } } } }