in src/blockio.rs [31:69]
fn fill_buffer(&mut self) -> Result<(), io::Error> {
let size = self.reader.read_u32::<LittleEndian>()?;
let not_size = self.reader.read_u32::<LittleEndian>()?;
let crc = self.reader.read_u32::<LittleEndian>()?;
if size != !not_size {
return Err(io::Error::new(
io::ErrorKind::InvalidData,
"Block header size is corrupt",
));
}
if size > BLOCK_MAX_SIZE as u32 {
return Err(io::Error::new(
io::ErrorKind::InvalidData,
"Block header size is too large",
));
}
let size = size as usize;
let mut buffer = &mut self.buffer[..size];
self.reader.read_exact(&mut buffer)?;
let mut digest = crc32::Digest::new(crc32::IEEE);
digest.write(buffer);
let actual_crc = digest.sum32();
if actual_crc != crc {
return Err(io::Error::new(
io::ErrorKind::InvalidData,
"Block header crc32 check failed",
));
}
self.pos = 0;
self.left = size;
Ok(())
}