fn fill_buffer()

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(())
	}