avm2: Throw AVM error for invalid frame labels

This commit is contained in:
Lord-McSweeney 2023-04-21 22:52:19 -07:00 committed by GitHub
parent ebb14a7ab6
commit 34156cc6d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 14 additions and 7 deletions

View File

@ -2,6 +2,7 @@
use crate::avm2::activation::Activation; use crate::avm2::activation::Activation;
use crate::avm2::array::ArrayStorage; use crate::avm2::array::ArrayStorage;
use crate::avm2::error::argument_error;
use crate::avm2::object::{ArrayObject, Object, TObject}; use crate::avm2::object::{ArrayObject, Object, TObject};
use crate::avm2::parameters::ParametersExt; use crate::avm2::parameters::ParametersExt;
use crate::avm2::value::Value; use crate::avm2::value::Value;
@ -386,18 +387,24 @@ pub fn goto_frame<'gc>(
//the requested frame exists within that scene. //the requested frame exists within that scene.
let scene = args[1].coerce_to_string(activation)?; let scene = args[1].coerce_to_string(activation)?;
if !mc.frame_exists_within_scene(&frame_or_label, &scene, &activation.context) { if !mc.frame_exists_within_scene(&frame_or_label, &scene, &activation.context) {
return Err(format!( return Err(Error::AvmError(argument_error(
"ArgumentError: Frame label {frame_or_label} not found in scene {scene}", activation,
) &format!("Error #2109: Frame label {frame_or_label} not found in scene {scene}."),
.into()); 2109,
)?));
} }
} }
let frame = mc.frame_label_to_number(&frame_or_label, &activation.context); let frame = mc.frame_label_to_number(&frame_or_label, &activation.context);
if activation.context.swf.version() >= 11 { if activation.context.swf.version() >= 11 {
frame.ok_or_else(|| { frame.ok_or(
format!("ArgumentError: {frame_or_label} is not a valid frame label.") // TODO: Also include the scene in the error message, as done above
})? as i32 Error::AvmError(argument_error(
activation,
&format!("Error #2109: {frame_or_label} is not a valid frame label."),
2109,
)?),
)? as i32
} else { } else {
frame.unwrap_or(0) as i32 // Old swf versions silently jump to frame 1 for invalid labels. frame.unwrap_or(0) as i32 // Old swf versions silently jump to frame 1 for invalid labels.
} }