diff --git a/block/src/formats/qcow/internal/header.rs b/block/src/formats/qcow/internal/header.rs index 1989f25e3..ece9acd4a 100644 --- a/block/src/formats/qcow/internal/header.rs +++ b/block/src/formats/qcow/internal/header.rs @@ -331,6 +331,11 @@ impl QcowHeader { if header.backing_file_size > MAX_BACKING_FILE_SIZE { return Err(Error::BackingFileTooLong(header.backing_file_size as usize)); } + if header.backing_file_offset == 0 && header.backing_file_size != 0 { + return Err(Error::BackingFileSizeWithoutOffset( + header.backing_file_size, + )); + } if header.backing_file_offset != 0 { let cluster_size = 1u64 .checked_shl(header.cluster_bits) diff --git a/block/src/formats/qcow/internal/mod.rs b/block/src/formats/qcow/internal/mod.rs index 8e436d0ea..ab4e6776c 100644 --- a/block/src/formats/qcow/internal/mod.rs +++ b/block/src/formats/qcow/internal/mod.rs @@ -74,6 +74,8 @@ pub enum Error { BackingFileOutsideFirstCluster(u64, u32, u64), #[error("Backing file name at offset {0:#x} length {1:#x} overlaps header of size {2:#x}")] BackingFileOverlapsHeader(u64, u32, u32), + #[error("Backing file size {0:#x} with zero offset")] + BackingFileSizeWithoutOffset(u32), #[error("Backing file support is disabled")] BackingFilesDisabled, #[error("Backing file name is too long: {0} bytes over")]