diff --git a/core/src/avm2/globals/flash/display3D/context_3d.rs b/core/src/avm2/globals/flash/display3D/context_3d.rs index 359420a62..0953e419a 100644 --- a/core/src/avm2/globals/flash/display3D/context_3d.rs +++ b/core/src/avm2/globals/flash/display3D/context_3d.rs @@ -1,4 +1,4 @@ -use crate::avm2::error::make_error_2008; +use crate::avm2::error::{error, make_error_2008}; use crate::avm2::parameters::ParametersExt; use crate::avm2::Activation; use crate::avm2::TObject; @@ -58,6 +58,22 @@ pub fn configure_back_buffer<'gc>( let width = args.get_u32(activation, 0)?; let height = args.get_u32(activation, 1)?; + if width < 32 || width > 16384 { + return Err(Error::AvmError(error( + activation, + "Error #3780: Requested width of backbuffer is not in allowed range 32 to 16384.", + 3780, + )?)); + } + + if height < 32 || height > 16384 { + return Err(Error::AvmError(error( + activation, + "Error #3781: Requested height of backbuffer is not in allowed range 32 to 16384.", + 3781, + )?)); + } + let anti_alias = args.get_u32(activation, 2)?; let enable_depth_and_stencil = args.get(3).unwrap_or(&Value::Undefined).coerce_to_boolean(); let wants_best_resolution = args.get(4).unwrap_or(&Value::Undefined).coerce_to_boolean(); diff --git a/tests/tests/swfs/avm2/stage3d_zero_size/Test.as b/tests/tests/swfs/avm2/stage3d_zero_size/Test.as new file mode 100644 index 000000000..68ebdc19a --- /dev/null +++ b/tests/tests/swfs/avm2/stage3d_zero_size/Test.as @@ -0,0 +1,38 @@ +package { + import flash.display.MovieClip; + import flash.display.Stage3D; + import flash.events.Event; + + public class Test { + public function Test(main:MovieClip) { + main.stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, function(event) { + var stage3d : Stage3D = event.target as Stage3D; + try { + stage3d.context3D.configureBackBuffer(0, 200, 0); + } catch (e) { + trace("Caught error: " + e); + } + + try { + stage3d.context3D.configureBackBuffer(200, 0, 0); + } catch (e) { + trace("Caught error: " + e); + } + + try { + stage3d.context3D.configureBackBuffer(999999999, 200, 0); + } catch (e) { + trace("Caught error: " + e); + } + + try { + stage3d.context3D.configureBackBuffer(200, 999999999, 0); + } catch (e) { + trace("Caught error: " + e); + } + + }) + main.stage.stage3Ds[0].requestContext3D(); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/stage3d_zero_size/output.txt b/tests/tests/swfs/avm2/stage3d_zero_size/output.txt new file mode 100644 index 000000000..f5ffcb9c3 --- /dev/null +++ b/tests/tests/swfs/avm2/stage3d_zero_size/output.txt @@ -0,0 +1,4 @@ +Caught error: Error: Error #3780: Requested width of backbuffer is not in allowed range 32 to 16384. +Caught error: Error: Error #3781: Requested height of backbuffer is not in allowed range 32 to 16384. +Caught error: Error: Error #3780: Requested width of backbuffer is not in allowed range 32 to 16384. +Caught error: Error: Error #3781: Requested height of backbuffer is not in allowed range 32 to 16384. diff --git a/tests/tests/swfs/avm2/stage3d_zero_size/test.fla b/tests/tests/swfs/avm2/stage3d_zero_size/test.fla new file mode 100644 index 000000000..e3c594110 Binary files /dev/null and b/tests/tests/swfs/avm2/stage3d_zero_size/test.fla differ diff --git a/tests/tests/swfs/avm2/stage3d_zero_size/test.swf b/tests/tests/swfs/avm2/stage3d_zero_size/test.swf new file mode 100644 index 000000000..24a121ee4 Binary files /dev/null and b/tests/tests/swfs/avm2/stage3d_zero_size/test.swf differ diff --git a/tests/tests/swfs/avm2/stage3d_zero_size/test.toml b/tests/tests/swfs/avm2/stage3d_zero_size/test.toml new file mode 100644 index 000000000..af27f16a6 --- /dev/null +++ b/tests/tests/swfs/avm2/stage3d_zero_size/test.toml @@ -0,0 +1,4 @@ +num_frames = 10 + +[player_options] +with_renderer = { optional = false, sample_count = 1 }