diff --git a/src/backup/dynamic_index.rs b/src/backup/dynamic_index.rs index 8731a418..08f9cdff 100644 --- a/src/backup/dynamic_index.rs +++ b/src/backup/dynamic_index.rs @@ -95,6 +95,18 @@ impl DynamicIndexReader { let header_size = std::mem::size_of::(); + let rawfd = file.as_raw_fd(); + let stat = match nix::sys::stat::fstat(rawfd) { + Ok(stat) => stat, + Err(err) => bail!("fstat failed - {}", err), + }; + + let size = stat.st_size as usize; + + if size < header_size { + bail!("index too small ({})", stat.st_size); + } + let header: Box = unsafe { file.read_host_value_boxed()? }; if header.magic != super::DYNAMIC_SIZED_CHUNK_INDEX_1_0 { @@ -103,13 +115,7 @@ impl DynamicIndexReader { let ctime = proxmox::tools::time::epoch_i64(); - let rawfd = file.as_raw_fd(); - - let stat = nix::sys::stat::fstat(rawfd)?; - - let size = stat.st_size as usize; - - let index_size = size - header_size; + let index_size = stat.st_size as usize - header_size; let index_count = index_size / 40; if index_count * 40 != index_size { bail!("got unexpected file size"); diff --git a/src/backup/fixed_index.rs b/src/backup/fixed_index.rs index eff50055..44ebfabe 100644 --- a/src/backup/fixed_index.rs +++ b/src/backup/fixed_index.rs @@ -68,6 +68,19 @@ impl FixedIndexReader { file.seek(SeekFrom::Start(0))?; let header_size = std::mem::size_of::(); + + let rawfd = file.as_raw_fd(); + let stat = match nix::sys::stat::fstat(rawfd) { + Ok(stat) => stat, + Err(err) => bail!("fstat failed - {}", err), + }; + + let size = stat.st_size as usize; + + if size < header_size { + bail!("index too small ({})", stat.st_size); + } + let header: Box = unsafe { file.read_host_value_boxed()? }; if header.magic != super::FIXED_SIZED_CHUNK_INDEX_1_0 { @@ -81,12 +94,6 @@ impl FixedIndexReader { let index_length = ((size + chunk_size - 1) / chunk_size) as usize; let index_size = index_length * 32; - let rawfd = file.as_raw_fd(); - - let stat = match nix::sys::stat::fstat(rawfd) { - Ok(stat) => stat, - Err(err) => bail!("fstat failed - {}", err), - }; let expected_index_size = (stat.st_size as usize) - header_size; if index_size != expected_index_size {