Skip to content
Snippets Groups Projects
Commit 49765789 authored by Antoine cezar's avatar Antoine cezar
Browse files

hg-core: return `Err` on decompression error (D8958#inline-15004 followup)

Differential Revision: https://phab.mercurial-scm.org/D9100
parent 48438e89
No related branches found
No related tags found
No related merge requests found
......@@ -247,5 +247,5 @@
// Raw revision data follows.
b'u' => Ok(Cow::Borrowed(&self.bytes[1..])),
// zlib (RFC 1950) data.
b'x' => Ok(Cow::Owned(self.uncompressed_zlib_data())),
b'x' => Ok(Cow::Owned(self.uncompressed_zlib_data()?)),
// zstd data.
......@@ -251,6 +251,6 @@
// zstd data.
b'\x28' => Ok(Cow::Owned(self.uncompressed_zstd_data())),
b'\x28' => Ok(Cow::Owned(self.uncompressed_zstd_data()?)),
format_type => Err(RevlogError::UnknowDataFormat(format_type)),
}
}
......@@ -253,8 +253,8 @@
format_type => Err(RevlogError::UnknowDataFormat(format_type)),
}
}
fn uncompressed_zlib_data(&self) -> Vec<u8> {
fn uncompressed_zlib_data(&self) -> Result<Vec<u8>, RevlogError> {
let mut decoder = ZlibDecoder::new(self.bytes);
if self.is_delta() {
let mut buf = Vec::with_capacity(self.compressed_len);
......@@ -258,7 +258,9 @@
let mut decoder = ZlibDecoder::new(self.bytes);
if self.is_delta() {
let mut buf = Vec::with_capacity(self.compressed_len);
decoder.read_to_end(&mut buf).expect("corrupted zlib data");
buf
decoder
.read_to_end(&mut buf)
.or(Err(RevlogError::Corrupted))?;
Ok(buf)
} else {
let mut buf = vec![0; self.uncompressed_len];
......@@ -263,7 +265,9 @@
} else {
let mut buf = vec![0; self.uncompressed_len];
decoder.read_exact(&mut buf).expect("corrupted zlib data");
buf
decoder
.read_exact(&mut buf)
.or(Err(RevlogError::Corrupted))?;
Ok(buf)
}
}
......@@ -267,7 +271,7 @@
}
}
fn uncompressed_zstd_data(&self) -> Vec<u8> {
fn uncompressed_zstd_data(&self) -> Result<Vec<u8>, RevlogError> {
if self.is_delta() {
let mut buf = Vec::with_capacity(self.compressed_len);
zstd::stream::copy_decode(self.bytes, &mut buf)
......@@ -271,8 +275,8 @@
if self.is_delta() {
let mut buf = Vec::with_capacity(self.compressed_len);
zstd::stream::copy_decode(self.bytes, &mut buf)
.expect("corrupted zstd data");
buf
.or(Err(RevlogError::Corrupted))?;
Ok(buf)
} else {
let mut buf = vec![0; self.uncompressed_len];
let len = zstd::block::decompress_to_buffer(self.bytes, &mut buf)
......@@ -276,9 +280,12 @@
} else {
let mut buf = vec![0; self.uncompressed_len];
let len = zstd::block::decompress_to_buffer(self.bytes, &mut buf)
.expect("corrupted zstd data");
assert_eq!(len, self.uncompressed_len, "corrupted zstd data");
buf
.or(Err(RevlogError::Corrupted))?;
if len != self.uncompressed_len {
Err(RevlogError::Corrupted)
} else {
Ok(buf)
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment