swf: Avoid using `Reader::input` directly

Change two cases to use `Reader::read_slice` instead of `self.input`.
Not only this avoids relying on an implementation detail, this also
raises an `UnexpectedEof` error if the read is beyond the SWF.
This commit is contained in:
relrelb 2021-07-12 22:42:48 +03:00 committed by relrelb
parent ef9c073d26
commit 99deb90a1f
1 changed files with 6 additions and 11 deletions

View File

@ -100,12 +100,10 @@ impl<'a> Reader<'a> {
}
fn read_string(&mut self) -> Result<String> {
let len = self.read_u30()? as usize;
let mut s = String::with_capacity(len);
self.input
.by_ref()
.take(len as u64)
.read_to_string(&mut s)?;
let len = self.read_u30()?;
// TODO: Avoid allocating a String.
let mut s = String::with_capacity(len as usize);
self.read_slice(len as usize)?.read_to_string(&mut s)?;
Ok(s)
}
@ -474,11 +472,8 @@ impl<'a> Reader<'a> {
// Read the code data.
let code_len = self.read_u30()?;
let mut code = Vec::with_capacity(code_len as usize);
self.input
.by_ref()
.take(code_len.into())
.read_to_end(&mut code)?;
// TODO: Avoid allocating a Vec.
let code = self.read_slice(code_len as usize)?.to_vec();
let num_exceptions = self.read_u30()? as usize;
let mut exceptions = Vec::with_capacity(num_exceptions);