core: Avoid panic on truncated SWF (fix #1583)

This commit is contained in:
Mike Welsh 2020-11-23 23:48:01 -08:00
parent 6b60fbe432
commit 8db4482fcf
1 changed files with 6 additions and 2 deletions

View File

@ -182,7 +182,9 @@ impl<'gc> MovieClip<'gc> {
let tag_callback = |reader: &mut SwfStream<&[u8]>, tag_code, tag_len| { let tag_callback = |reader: &mut SwfStream<&[u8]>, tag_code, tag_len| {
let data = *reader.get_inner().get_ref(); let data = *reader.get_inner().get_ref();
let tag_pos = reader.get_inner().position() as usize; let tag_pos = reader.get_inner().position() as usize;
let tag_slice = &data[tag_pos..tag_pos + tag_len]; let tag_slice = data
.get(tag_pos..tag_pos + tag_len)
.ok_or("Unexpected end of tag")?;
let reader = &mut SwfStream::new(std::io::Cursor::new(tag_slice), version); let reader = &mut SwfStream::new(std::io::Cursor::new(tag_slice), version);
match tag_code { match tag_code {
TagCode::FileAttributes => { TagCode::FileAttributes => {
@ -1118,7 +1120,9 @@ impl<'gc> MovieClip<'gc> {
let tag_callback = |reader: &mut SwfStream<&[u8]>, tag_code, tag_len| { let tag_callback = |reader: &mut SwfStream<&[u8]>, tag_code, tag_len| {
let data = *reader.get_inner().get_ref(); let data = *reader.get_inner().get_ref();
let tag_pos = reader.get_inner().position() as usize; let tag_pos = reader.get_inner().position() as usize;
let tag_slice = &data[tag_pos..tag_pos + tag_len]; let tag_slice = data
.get(tag_pos..tag_pos + tag_len)
.ok_or("Not enough data for tag")?;
let reader = &mut SwfStream::new(std::io::Cursor::new(tag_slice), version); let reader = &mut SwfStream::new(std::io::Cursor::new(tag_slice), version);
match tag_code { match tag_code {
TagCode::DoAction => self.do_action(self_display_object, context, reader, tag_len), TagCode::DoAction => self.do_action(self_display_object, context, reader, tag_len),