From fe4b562a0f8531df342be74448c4e709ce33baa5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Jun 2026 10:52:52 -0700 Subject: [PATCH] fix(ec): reject a short shard read in the local EC needle reader read_ec_shard_needle ignored the byte count from shard.read_at and appended the whole pre-sized buffer, so a truncated shard's zero-filled tail passed the later length check and parsed as garbage. Require n == buf.len() per interval, erroring on a short read like the local interval reader already does. --- .../src/storage/erasure_coding/ec_volume.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/seaweed-volume/src/storage/erasure_coding/ec_volume.rs b/seaweed-volume/src/storage/erasure_coding/ec_volume.rs index 77d095a4c..460e463d7 100644 --- a/seaweed-volume/src/storage/erasure_coding/ec_volume.rs +++ b/seaweed-volume/src/storage/erasure_coding/ec_volume.rs @@ -619,7 +619,19 @@ impl EcVolume { })?; let mut buf = vec![0u8; interval.size as usize]; - shard.read_at(&mut buf, shard_offset as u64)?; + let n = shard.read_at(&mut buf, shard_offset as u64)?; + if n != buf.len() { + return Err(io::Error::new( + io::ErrorKind::UnexpectedEof, + format!( + "short read on ec shard {}: read {} of {} bytes for needle {}", + shard_id, + n, + buf.len(), + needle_id + ), + )); + } bytes.extend_from_slice(&buf); }