flv: `Header::parse` should always leave the stream reader in a reasonable position

This commit is contained in:
David Wendt 2023-04-11 18:24:05 -04:00 committed by kmeisthax
parent 20d33df458
commit d23378dd80
1 changed files with 26 additions and 13 deletions

View File

@ -1,5 +1,6 @@
use crate::reader::FlvReader;
use bitflags::bitflags;
use std::io::{Seek, SeekFrom};
bitflags! {
#[derive(PartialEq, Eq, Debug)]
@ -22,20 +23,32 @@ impl Header {
/// If this yields `None`, then the given data stream is either not an FLV
/// container or too short to parse.
pub fn parse(reader: &mut FlvReader<'_>) -> Option<Self> {
let signature = reader.read_u24()?;
if signature != 0x464C56 {
return None;
let old_position = reader.stream_position().ok()?;
let ret = (|| {
let signature = reader.read_u24()?;
if signature != 0x464C56 {
return None;
}
let version = reader.read_u8()?;
let type_flags = TypeFlags::from_bits_retain(reader.read_u8()?);
let data_offset = reader.read_u32()?;
Some(Header {
version,
type_flags,
data_offset,
})
})();
if let Some(ret) = ret {
reader.seek(SeekFrom::Start(ret.data_offset as u64)).ok()?;
Some(ret)
} else {
reader.seek(SeekFrom::Start(old_position)).ok()?;
None
}
let version = reader.read_u8()?;
let type_flags = TypeFlags::from_bits_retain(reader.read_u8()?);
let data_offset = reader.read_u32()?;
Some(Header {
version,
type_flags,
data_offset,
})
}
}