mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-22 04:16:38 +00:00
fix(filemeta): reject positive size without parts (#5354)
* fix(filemeta): reject positive size without parts * test(ecstore): keep optimized read fixture valid * test(ecstore): keep listing fixtures valid
This commit is contained in:
@@ -415,6 +415,10 @@ impl FileInfo {
|
||||
}
|
||||
|
||||
fn validate_collection_contents(&self, layout: Option<&ValidatedErasureLayout>) -> Result<()> {
|
||||
if layout.is_some() && self.size > 0 && self.parts.is_empty() {
|
||||
return Err(Error::FileCorrupt);
|
||||
}
|
||||
|
||||
let mut part_numbers = [0u64; FILEINFO_PART_BITMAP_WORDS];
|
||||
for part in &self.parts {
|
||||
if let Some(layout) = layout {
|
||||
@@ -692,6 +696,10 @@ impl FileInfo {
|
||||
|
||||
// to_part_offset gets the part index where offset is located, returns part index and offset
|
||||
pub fn to_part_offset(&self, offset: usize) -> Result<(usize, usize)> {
|
||||
if self.size > 0 && self.parts.is_empty() {
|
||||
return Err(Error::FileCorrupt);
|
||||
}
|
||||
|
||||
if offset == 0 {
|
||||
return Ok((0, 0));
|
||||
}
|
||||
@@ -1185,6 +1193,21 @@ mod tests {
|
||||
assert_eq!(layout.expect("strict layout must be present").data_blocks, 16);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn validate_require_erasure_rejects_positive_size_without_parts() {
|
||||
let mut fi = FileInfo::new("bucket/object", 4, 2);
|
||||
fi.erasure.index = 1;
|
||||
fi.size = 1;
|
||||
|
||||
assert_eq!(fi.validate_for_metadata_read(), Err(Error::FileCorrupt));
|
||||
assert_eq!(fi.to_part_offset(0), Err(Error::FileCorrupt));
|
||||
|
||||
fi.size = 0;
|
||||
fi.validate_for_metadata_read()
|
||||
.expect("zero-byte object metadata may omit parts");
|
||||
assert_eq!(fi.to_part_offset(0), Ok((0, 0)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn validate_for_erasure_write_only_relaxes_pending_shard_index() {
|
||||
let mut fi = validation_test_fileinfo();
|
||||
|
||||
Reference in New Issue
Block a user