From fdd86c1da2ecf048530673053f07b59713397586 Mon Sep 17 00:00:00 2001 From: Marco Bartoli Date: Tue, 13 Aug 2024 17:57:22 +0200 Subject: [PATCH] avm2: avoid enqueuing Sound.play an infinite amount of times (#17425) --- core/src/avm2/object/sound_object.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/avm2/object/sound_object.rs b/core/src/avm2/object/sound_object.rs index 93001311d..2ffc08457 100644 --- a/core/src/avm2/object/sound_object.rs +++ b/core/src/avm2/object/sound_object.rs @@ -7,7 +7,7 @@ use crate::avm2::value::Value; use crate::avm2::Avm2; use crate::avm2::Error; use crate::avm2::EventObject; -use crate::backend::audio::SoundHandle; +use crate::backend::audio::{AudioManager, SoundHandle}; use crate::context::UpdateContext; use crate::display_object::SoundTransform; use crate::string::AvmString; @@ -123,6 +123,12 @@ impl<'gc> SoundObject<'gc> { .borrow_mut(); match &mut *sound_data { SoundData::NotLoaded { queued_plays } => { + // Avoid to enqueue more unloaded sounds than the maximum allowed to be played + if queued_plays.len() >= AudioManager::MAX_SOUNDS { + tracing::warn!("Sound.play: too many unloaded sounds queued"); + return Ok(false); + } + queued_plays.push(queued); // We don't know the length yet, so return the `SoundChannel` Ok(true)