History

Now with counting of consumed bytes in extensions (#293)

This leads to the first seemingly correct parsing of simple index files.

Sebastian Thiel committed 4 years ago

Commit 77a062c1 parent da556b02 files · +11 −4Browse files

Unified · Split

2 files
  1. git-index/src/decode.rs +3 −3
  2. git-index/src/extension/mod.rs +8 −1
git-index/src/decode.rs+3−3
@@ -318,9 +318,9 @@ fn read_u16(data: &[u8]) -> Option<(u16, &[u8])> { · 317 unmodified lines
318318
319319 fn load_extensions(beginning_of_extensions: &[u8], object_hash: git_hash::Kind) -> (Extensions, &[u8]) {
320320 extension::Iter::new_without_checksum(beginning_of_extensions, object_hash)
321− .map(|mut extensions| {
321+ .map(|mut ext_iter| {
322322 let mut ext = Extensions::default();
323− for (signature, ext_data) in extensions.by_ref() {
323+ for (signature, ext_data) in ext_iter.by_ref() {
324324 match signature {
325325 extension::tree::SIGNATURE => {
326326 ext.cache_tree = extension::tree::decode(ext_data, object_hash);
@@ -329,7 +329,7 @@ fn load_extensions(beginning_of_extensions: &[u8], object_hash: git_hash::Kind) · 2 unmodified lines
329329 _unknown => {} // skip unknown extensions, too
330330 }
331331 }
332− (ext, extensions.data)
332+ (ext, &beginning_of_extensions[ext_iter.consumed..])
333333 })
334334 .unwrap_or_else(|| (Extensions::default(), beginning_of_extensions))
335335 }
git-index/src/extension/mod.rs+8−1
@@ -81,6 +81,7 @@ mod iter { · 80 unmodified lines
8181 pub fn new(data_at_beginning_of_extensions_and_truncated: &'a [u8]) -> Self {
8282 Iter {
8383 data: data_at_beginning_of_extensions_and_truncated,
84+ consumed: 0,
8485 }
8586 }
8687
@@ -93,6 +94,7 @@ mod iter { · 6 unmodified lines
9394 .checked_sub(object_hash.len_in_bytes())?;
9495 Iter {
9596 data: &data_at_beginning_of_extensions[..end],
97+ consumed: 0,
9698 }
9799 .into()
98100 }
@@ -108,11 +110,15 @@ mod iter { · 9 unmodified lines
108110
109111 let (signature, data) = self.data.split_at(4);
110112 let (size, data) = data.split_at(4);
113+ self.data = data;
114+ self.consumed += 4 + 4;
115+
111116 let size = from_be_u32(size) as usize;
112117
113118 match data.get(..size) {
114119 Some(ext_data) => {
115120 self.data = &data[size..];
121+ self.consumed += size;
116122 Some((signature.try_into().unwrap(), ext_data))
117123 }
118124 None => {
@@ -125,5 +131,6 @@ mod iter { · 6 unmodified lines
125131 }
126132
127133 pub struct Iter<'a> {
128− pub data: &'a [u8],
134+ data: &'a [u8],
135+ pub consumed: usize,
129136 }