mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-23 04:39:04 +00:00
fix(scanner): reject trailing cycle state bytes
This commit is contained in:
@@ -86,7 +86,11 @@ pub(super) fn decode_scanner_cycle_state(buf: &[u8]) -> Result<(CurrentCycle, u6
|
|||||||
(0, &buf[8..])
|
(0, &buf[8..])
|
||||||
};
|
};
|
||||||
|
|
||||||
let cycle_info = rmp_serde::from_slice::<CurrentCycle>(payload)?;
|
let mut deserializer = rmp_serde::Deserializer::new(std::io::Cursor::new(payload));
|
||||||
|
let cycle_info = CurrentCycle::deserialize(&mut deserializer)?;
|
||||||
|
if deserializer.position() != u64::try_from(payload.len()).unwrap_or(u64::MAX) {
|
||||||
|
return Err(ScannerCycleStateError::InvalidData("scanner cycle state has trailing bytes"));
|
||||||
|
}
|
||||||
if cycle_info.next != persisted_next {
|
if cycle_info.next != persisted_next {
|
||||||
return Err(ScannerCycleStateError::InvalidData("scanner cycle counter disagrees with encoded state"));
|
return Err(ScannerCycleStateError::InvalidData("scanner cycle counter disagrees with encoded state"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -963,6 +963,10 @@ fn scanner_cycle_state_decodes_legacy_and_fenced_formats() {
|
|||||||
let (fenced_cycle, fenced_epoch) = decode_scanner_cycle_state(&fenced).expect("fenced cycle state should decode");
|
let (fenced_cycle, fenced_epoch) = decode_scanner_cycle_state(&fenced).expect("fenced cycle state should decode");
|
||||||
assert_eq!(fenced_cycle.next, 13);
|
assert_eq!(fenced_cycle.next, 13);
|
||||||
assert_eq!(fenced_epoch, 7);
|
assert_eq!(fenced_epoch, 7);
|
||||||
|
|
||||||
|
let mut trailing = fenced;
|
||||||
|
trailing.push(0);
|
||||||
|
assert!(decode_scanner_cycle_state(&trailing).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user