diff --git a/rust/hg-core/src/revlog/index.rs b/rust/hg-core/src/revlog/index.rs --- a/rust/hg-core/src/revlog/index.rs +++ b/rust/hg-core/src/revlog/index.rs @@ -2,6 +2,7 @@ use byteorder::{BigEndian, ByteOrder}; +use crate::revlog::revlog::RevlogError; use crate::revlog::{Revision, NULL_REVISION}; pub const INDEX_ENTRY_SIZE: usize = 64; @@ -17,7 +18,9 @@ impl Index { /// Create an index from bytes. /// Calculate the start of each entry when is_inline is true. - pub fn new(bytes: Box + Send>) -> Self { + pub fn new( + bytes: Box + Send>, + ) -> Result { if is_inline(&bytes) { let mut offset: usize = 0; let mut offsets = Vec::new(); @@ -33,15 +36,19 @@ offset += INDEX_ENTRY_SIZE + entry.compressed_len(); } - Self { - bytes, - offsets: Some(offsets), + if offset == bytes.len() { + Ok(Self { + bytes, + offsets: Some(offsets), + }) + } else { + Err(RevlogError::Corrupted) } } else { - Self { + Ok(Self { bytes, offsets: None, - } + }) } } diff --git a/rust/hg-core/src/revlog/revlog.rs b/rust/hg-core/src/revlog/revlog.rs --- a/rust/hg-core/src/revlog/revlog.rs +++ b/rust/hg-core/src/revlog/revlog.rs @@ -56,7 +56,7 @@ return Err(RevlogError::UnsuportedVersion(version)); } - let index = Index::new(Box::new(index_mmap)); + let index = Index::new(Box::new(index_mmap))?; // TODO load data only when needed // // type annotation required