Avoid reading tags in read_jpeg
This commit is contained in:
1 parent
bc2055243a
commit
593479e5e3
1 file changed
+10
-16
+10
-16
@@ -1222,33 +1222,27 @@ impl<R: Read + Seek> Decoder<R> {
|
|||||||
pub fn read_jpeg(&mut self) -> TiffResult<DecodingResult> {
|
pub fn read_jpeg(&mut self) -> TiffResult<DecodingResult> {
|
||||||
self.check_chunk_type(ChunkType::Strip)?;
|
self.check_chunk_type(ChunkType::Strip)?;
|
||||||
|
|
||||||
let offsets = self.get_tag_u32_vec(Tag::StripOffsets)?;
|
if self.image().chunk_offsets.len() == 0 {
|
||||||
let bytes = self.get_tag_u32_vec(Tag::StripByteCounts)?;
|
|
||||||
|
|
||||||
if offsets.len() == 0 {
|
|
||||||
return Err(TiffError::FormatError(TiffFormatError::RequiredTagEmpty(
|
return Err(TiffError::FormatError(TiffFormatError::RequiredTagEmpty(
|
||||||
Tag::StripOffsets,
|
Tag::StripOffsets,
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
if offsets.len() != bytes.len() {
|
|
||||||
return Err(TiffError::FormatError(
|
|
||||||
TiffFormatError::InconsistentSizesEncountered,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
if offsets[0] as usize > self.limits.intermediate_buffer_size
|
if self.image().chunk_offsets[0] as usize > self.limits.intermediate_buffer_size
|
||||||
|| bytes
|
|| self.image().chunk_bytes
|
||||||
.iter()
|
.iter()
|
||||||
.any(|&x| x as usize > self.limits.intermediate_buffer_size)
|
.any(|&x| x as usize > self.limits.intermediate_buffer_size)
|
||||||
{
|
{
|
||||||
return Err(TiffError::LimitsExceeded);
|
return Err(TiffError::LimitsExceeded);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut res_img = Vec::with_capacity(offsets[0] as usize);
|
let mut res_img = Vec::with_capacity(self.image().chunk_offsets[0] as usize);
|
||||||
|
|
||||||
for (idx, offset) in offsets.iter().enumerate() {
|
for idx in 0..self.image.chunk_offsets.len() {
|
||||||
self.goto_offset(*offset)?;
|
let offset = self.image.chunk_offsets[idx];
|
||||||
let length = bytes[idx];
|
let length = self.image.chunk_bytes[idx];
|
||||||
|
|
||||||
|
self.goto_offset_u64(offset)?;
|
||||||
|
|
||||||
if self.image().jpeg_tables.is_some() && length < 2 {
|
if self.image().jpeg_tables.is_some() && length < 2 {
|
||||||
return Err(TiffError::FormatError(
|
return Err(TiffError::FormatError(
|
||||||
@@ -1258,7 +1252,7 @@ impl<R: Read + Seek> Decoder<R> {
|
|||||||
// TODO: avoid this clone
|
// TODO: avoid this clone
|
||||||
let jpeg_tables = self.image().jpeg_tables.clone();
|
let jpeg_tables = self.image().jpeg_tables.clone();
|
||||||
|
|
||||||
let jpeg_reader = JpegReader::new(&mut self.reader, length, &jpeg_tables)?;
|
let jpeg_reader = JpegReader::new(&mut self.reader, u32::try_from(length)?, &jpeg_tables)?;
|
||||||
let mut decoder = jpeg::Decoder::new(jpeg_reader);
|
let mut decoder = jpeg::Decoder::new(jpeg_reader);
|
||||||
|
|
||||||
match decoder.decode() {
|
match decoder.decode() {
|
||||||
|
|||||||
Reference in new issue
Block a user