# HG changeset patch # User Antoine cezar # Date 1601299316 -7200 # Node ID 1cef583541c02668705705ee6a32f7d0d5f78a54 # Parent 900b9b79b99cc57c478616949fb58d9c91012864 hg-core: return Err if `offset != bytes.len()` (D8958#inline-14994 followup 2/2) [X] make `Index` owner of its bytes [X] make `Index::new` return an error if `offset != bytes.len()` Differential Revision: https://phab.mercurial-scm.org/D9107 diff -r 900b9b79b99c -r 1cef583541c0 rust/hg-core/src/revlog/index.rs --- a/rust/hg-core/src/revlog/index.rs Mon Sep 28 15:13:51 2020 +0200 +++ b/rust/hg-core/src/revlog/index.rs Mon Sep 28 15:21:56 2020 +0200 @@ -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 -r 900b9b79b99c -r 1cef583541c0 rust/hg-core/src/revlog/revlog.rs --- a/rust/hg-core/src/revlog/revlog.rs Mon Sep 28 15:13:51 2020 +0200 +++ b/rust/hg-core/src/revlog/revlog.rs Mon Sep 28 15:21:56 2020 +0200 @@ -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