Decompress the cluster, return EIO on failure
(&mut self, l2_entry: u64)
| 1394 | |
| 1395 | // Decompress the cluster, return EIO on failure |
| 1396 | fn decompress_l2_cluster(&mut self, l2_entry: u64) -> std::io::Result<Vec<u8>> { |
| 1397 | let (compressed_cluster_addr, compressed_cluster_size) = |
| 1398 | l2_entry_compressed_cluster_layout(l2_entry, self.header.cluster_bits); |
| 1399 | // Read compressed cluster from raw file |
| 1400 | self.raw_file |
| 1401 | .file_mut() |
| 1402 | .seek(SeekFrom::Start(compressed_cluster_addr))?; |
| 1403 | let mut compressed_cluster = vec![0; compressed_cluster_size]; |
| 1404 | self.raw_file |
| 1405 | .file_mut() |
| 1406 | .read_exact(&mut compressed_cluster)?; |
| 1407 | let decoder = self.header.get_decoder(); |
| 1408 | // Decompress |
| 1409 | let cluster_size = self.raw_file.cluster_size() as usize; |
| 1410 | let mut decompressed_cluster = vec![0; cluster_size]; |
| 1411 | let decompressed_size = decoder |
| 1412 | .decode(&compressed_cluster, &mut decompressed_cluster) |
| 1413 | .map_err(|_| { |
| 1414 | self.set_corrupt_bit_best_effort(); |
| 1415 | io::Error::from_raw_os_error(EIO) |
| 1416 | })?; |
| 1417 | if decompressed_size as u64 != self.raw_file.cluster_size() { |
| 1418 | self.set_corrupt_bit_best_effort(); |
| 1419 | return Err(std::io::Error::from_raw_os_error(EIO)); |
| 1420 | } |
| 1421 | Ok(decompressed_cluster) |
| 1422 | } |
| 1423 | |
| 1424 | fn file_read( |
| 1425 | &mut self, |
no test coverage detected