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 <d.csapak@proxmox.com>
This commit is contained in:
parent
788d82d9b7
commit
79c9bf55b9
|
@ -95,6 +95,18 @@ impl DynamicIndexReader {
|
||||||
|
|
||||||
let header_size = std::mem::size_of::<DynamicIndexHeader>();
|
let header_size = std::mem::size_of::<DynamicIndexHeader>();
|
||||||
|
|
||||||
|
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<DynamicIndexHeader> = unsafe { file.read_host_value_boxed()? };
|
let header: Box<DynamicIndexHeader> = unsafe { file.read_host_value_boxed()? };
|
||||||
|
|
||||||
if header.magic != super::DYNAMIC_SIZED_CHUNK_INDEX_1_0 {
|
if header.magic != super::DYNAMIC_SIZED_CHUNK_INDEX_1_0 {
|
||||||
|
@ -103,13 +115,7 @@ impl DynamicIndexReader {
|
||||||
|
|
||||||
let ctime = proxmox::tools::time::epoch_i64();
|
let ctime = proxmox::tools::time::epoch_i64();
|
||||||
|
|
||||||
let rawfd = file.as_raw_fd();
|
let index_size = stat.st_size as usize - header_size;
|
||||||
|
|
||||||
let stat = nix::sys::stat::fstat(rawfd)?;
|
|
||||||
|
|
||||||
let size = stat.st_size as usize;
|
|
||||||
|
|
||||||
let index_size = size - header_size;
|
|
||||||
let index_count = index_size / 40;
|
let index_count = index_size / 40;
|
||||||
if index_count * 40 != index_size {
|
if index_count * 40 != index_size {
|
||||||
bail!("got unexpected file size");
|
bail!("got unexpected file size");
|
||||||
|
|
|
@ -68,6 +68,19 @@ impl FixedIndexReader {
|
||||||
file.seek(SeekFrom::Start(0))?;
|
file.seek(SeekFrom::Start(0))?;
|
||||||
|
|
||||||
let header_size = std::mem::size_of::<FixedIndexHeader>();
|
let header_size = std::mem::size_of::<FixedIndexHeader>();
|
||||||
|
|
||||||
|
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<FixedIndexHeader> = unsafe { file.read_host_value_boxed()? };
|
let header: Box<FixedIndexHeader> = unsafe { file.read_host_value_boxed()? };
|
||||||
|
|
||||||
if header.magic != super::FIXED_SIZED_CHUNK_INDEX_1_0 {
|
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_length = ((size + chunk_size - 1) / chunk_size) as usize;
|
||||||
let index_size = index_length * 32;
|
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;
|
let expected_index_size = (stat.st_size as usize) - header_size;
|
||||||
if index_size != expected_index_size {
|
if index_size != expected_index_size {
|
||||||
|
|
Loading…
Reference in New Issue