From 79c9bf55b919262cca0a4b0e8044e8381e2f0cdb Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Mon, 2 Nov 2020 12:34:36 +0100 Subject: [PATCH] backup/{dynamic, fixed}_index: improve error message for small index files index files that were smaller than their respective header size, would fail with "failed to fill whole buffer" instead now check explicitely for the size and fail with "index too small (size)" Signed-off-by: Dominik Csapak --- src/backup/dynamic_index.rs | 20 +++++++++++++------- src/backup/fixed_index.rs | 19 +++++++++++++------ 2 files changed, 26 insertions(+), 13 deletions(-) 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 {