From 5b1b2136916e24aaf9a0ddfe9bd9e58f66357f2f Mon Sep 17 00:00:00 2001 From: Jan-Paul Bultmann <74891396+somethingelseentirely@users.noreply.github.com> Date: Fri, 26 Sep 2025 20:46:55 +0200 Subject: [PATCH] Guard against CompactVector metadata overflow --- CHANGELOG.md | 1 + src/int_vectors/compact_vector.rs | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fc7805..9862d9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## Unreleased +- Guarded `CompactVector::from_bytes` against metadata bit-length overflow. - Removed the `anyhow` dependency in favor of crate-defined errors and updated `Serializable` to expose an associated error type for reconstruction. - Prevent panic in `DacsByte::len` by handling empty level lists gracefully. diff --git a/src/int_vectors/compact_vector.rs b/src/int_vectors/compact_vector.rs index 90d6595..76831e6 100644 --- a/src/int_vectors/compact_vector.rs +++ b/src/int_vectors/compact_vector.rs @@ -458,7 +458,10 @@ impl Serializable for CompactVector { } fn from_bytes(meta: Self::Meta, bytes: Bytes) -> Result { - let data_len = meta.len * meta.width; + let data_len = meta + .len + .checked_mul(meta.width) + .ok_or_else(|| Error::invalid_metadata("len * width overflowed"))?; let data = BitVectorData::from_bytes( BitVectorDataMeta { len: data_len, @@ -710,4 +713,16 @@ mod tests { let other = CompactVector::from_bytes(meta, bytes).unwrap(); assert_eq!(cv, other); } + + #[test] + fn from_bytes_rejects_overflowing_metadata() { + let cv = CompactVector::from_slice(&[1]).unwrap(); + let mut meta = cv.metadata(); + meta.len = usize::MAX; + meta.width = 2; + let bytes = cv.chunks.data.words.clone().bytes(); + + let err = CompactVector::from_bytes(meta, bytes).unwrap_err(); + assert!(matches!(err, Error::InvalidMetadata(_))); + } }