avm2: Use correct error when accessing domain memory out of bounds

This commit is contained in:
Nathan Adams 2023-08-03 00:42:50 +02:00
parent c3a283e23d
commit 3d76953574
3 changed files with 41 additions and 14 deletions

View File

@ -6,7 +6,7 @@ use crate::avm2::domain::Domain;
use crate::avm2::e4x::{escape_attribute_value, escape_element_value}; use crate::avm2::e4x::{escape_attribute_value, escape_element_value};
use crate::avm2::error::{ use crate::avm2::error::{
argument_error, make_error_1127, make_null_or_undefined_error, make_reference_error, argument_error, make_error_1127, make_null_or_undefined_error, make_reference_error,
type_error, ReferenceErrorCode, range_error, type_error, ReferenceErrorCode,
}; };
use crate::avm2::method::{BytecodeMethod, Method, ParamConfig}; use crate::avm2::method::{BytecodeMethod, Method, ParamConfig};
use crate::avm2::object::{ use crate::avm2::object::{
@ -3005,8 +3005,13 @@ impl<'a, 'gc> Activation<'a, 'gc> {
.as_bytearray_mut(self.context.gc_context) .as_bytearray_mut(self.context.gc_context)
.ok_or_else(|| "Unable to get bytearray storage".to_string())?; .ok_or_else(|| "Unable to get bytearray storage".to_string())?;
let address = let Ok(address) = usize::try_from(address) else {
usize::try_from(address).map_err(|_| "RangeError: The specified range is invalid")?; return Err(Error::AvmError(range_error(
self,
"Error #1506: The range specified is invalid.",
1506,
)?));
};
dm.write_at_nongrowing(&val.to_le_bytes(), address) dm.write_at_nongrowing(&val.to_le_bytes(), address)
.map_err(|e| e.to_avm(self))?; .map_err(|e| e.to_avm(self))?;
@ -3023,8 +3028,13 @@ impl<'a, 'gc> Activation<'a, 'gc> {
.as_bytearray_mut(self.context.gc_context) .as_bytearray_mut(self.context.gc_context)
.ok_or_else(|| "Unable to get bytearray storage".to_string())?; .ok_or_else(|| "Unable to get bytearray storage".to_string())?;
let address = let Ok(address) = usize::try_from(address) else {
usize::try_from(address).map_err(|_| "RangeError: The specified range is invalid")?; return Err(Error::AvmError(range_error(
self,
"Error #1506: The range specified is invalid.",
1506,
)?));
};
dm.write_at_nongrowing(&val.to_le_bytes(), address) dm.write_at_nongrowing(&val.to_le_bytes(), address)
.map_err(|e| e.to_avm(self))?; .map_err(|e| e.to_avm(self))?;
@ -3041,8 +3051,13 @@ impl<'a, 'gc> Activation<'a, 'gc> {
.as_bytearray_mut(self.context.gc_context) .as_bytearray_mut(self.context.gc_context)
.ok_or_else(|| "Unable to get bytearray storage".to_string())?; .ok_or_else(|| "Unable to get bytearray storage".to_string())?;
let address = let Ok(address) = usize::try_from(address) else {
usize::try_from(address).map_err(|_| "RangeError: The specified range is invalid")?; return Err(Error::AvmError(range_error(
self,
"Error #1506: The range specified is invalid.",
1506,
)?));
};
dm.write_at_nongrowing(&val.to_le_bytes(), address) dm.write_at_nongrowing(&val.to_le_bytes(), address)
.map_err(|e| e.to_avm(self))?; .map_err(|e| e.to_avm(self))?;
@ -3059,8 +3074,13 @@ impl<'a, 'gc> Activation<'a, 'gc> {
.as_bytearray_mut(self.context.gc_context) .as_bytearray_mut(self.context.gc_context)
.ok_or_else(|| "Unable to get bytearray storage".to_string())?; .ok_or_else(|| "Unable to get bytearray storage".to_string())?;
let address = let Ok(address) = usize::try_from(address) else {
usize::try_from(address).map_err(|_| "RangeError: The specified range is invalid")?; return Err(Error::AvmError(range_error(
self,
"Error #1506: The range specified is invalid.",
1506,
)?));
};
dm.write_at_nongrowing(&val.to_le_bytes(), address) dm.write_at_nongrowing(&val.to_le_bytes(), address)
.map_err(|e| e.to_avm(self))?; .map_err(|e| e.to_avm(self))?;
@ -3077,8 +3097,13 @@ impl<'a, 'gc> Activation<'a, 'gc> {
.as_bytearray_mut(self.context.gc_context) .as_bytearray_mut(self.context.gc_context)
.ok_or_else(|| "Unable to get bytearray storage".to_string())?; .ok_or_else(|| "Unable to get bytearray storage".to_string())?;
let address = let Ok(address) = usize::try_from(address) else {
usize::try_from(address).map_err(|_| "RangeError: The specified range is invalid")?; return Err(Error::AvmError(range_error(
self,
"Error #1506: The range specified is invalid.",
1506,
)?));
};
dm.write_at_nongrowing(&val.to_le_bytes(), address) dm.write_at_nongrowing(&val.to_le_bytes(), address)
.map_err(|e| e.to_avm(self))?; .map_err(|e| e.to_avm(self))?;
@ -3098,7 +3123,11 @@ impl<'a, 'gc> Activation<'a, 'gc> {
if let Some(val) = val { if let Some(val) = val {
self.push_stack(val); self.push_stack(val);
} else { } else {
return Err("RangeError: The specified range is invalid".into()); return Err(Error::AvmError(range_error(
self,
"Error #1506: The range specified is invalid.",
1506,
)?));
} }
Ok(FrameControl::Continue) Ok(FrameControl::Continue)

View File

@ -1,2 +1 @@
num_ticks = 1 num_ticks = 1
known_failure = true

View File

@ -1,2 +1 @@
num_ticks = 1 num_ticks = 1
known_failure = true