Skip to content

Commit 1dc2a5d

Browse files
committed
Merge branch 'fix-loose-parsing'
2 parents 67777a8 + 2df3c73 commit 1dc2a5d

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

git-object/src/object/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,14 @@ impl<'a> ObjectRef<'a> {
180180
/// Deserialize an object from a loose serialisation
181181
pub fn from_loose(data: &'a [u8]) -> Result<ObjectRef<'a>, LooseDecodeError> {
182182
let (kind, size, offset) = loose_header(data)?;
183-
Ok(Self::from_bytes(kind, &data[offset..][..size])?)
183+
184+
let body = &data[offset..]
185+
.get(..size)
186+
.ok_or(LooseHeaderDecodeError::InvalidHeader {
187+
message: "object data was shorter than its size declared in the header",
188+
})?;
189+
190+
Ok(Self::from_bytes(kind, body)?)
184191
}
185192

186193
/// Deserialize an object of `kind` from the given `data`.

git-object/tests/loose.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use bstr::ByteSlice;
2-
use git_object::{decode, encode, Kind};
2+
use git_object::{decode, encode, Kind, ObjectRef};
33

44
#[test]
55
fn all() -> Result<(), Box<dyn std::error::Error>> {
@@ -18,3 +18,11 @@ fn all() -> Result<(), Box<dyn std::error::Error>> {
1818
}
1919
Ok(())
2020
}
21+
22+
#[test]
23+
fn shorter_than_advertised() {
24+
assert_eq!(
25+
ObjectRef::from_loose(b"tree 1000\x00").unwrap_err().to_string(),
26+
"object data was shorter than its size declared in the header"
27+
);
28+
}

0 commit comments

Comments
 (0)