From 1cb79a0b9141d4ec9962f77d20d6e3c16e3dce0c Mon Sep 17 00:00:00 2001 From: Mathijs van de Nes Date: Wed, 23 May 2018 19:42:52 +0200 Subject: [PATCH] Fix memory issues on corrupt zip files Do not pre-allocate the number of files, as this might be an invalid number. Also give a more helpfull error message when the start of the central directory could not be found. Resolves #68 --- src/read.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/read.rs b/src/read.rs index 749ff0e0..e0ea7f8f 100644 --- a/src/read.rs +++ b/src/read.rs @@ -178,10 +178,13 @@ impl ZipArchive let (archive_offset, directory_start, number_of_files) = try!(Self::get_directory_counts(&mut reader, &footer, cde_start_pos)); - let mut files = Vec::with_capacity(number_of_files); + let mut files = Vec::new(); let mut names_map = HashMap::new(); - try!(reader.seek(io::SeekFrom::Start(directory_start))); + if let Err(_) = reader.seek(io::SeekFrom::Start(directory_start)) { + return Err(ZipError::InvalidArchive("Could not seek to start of central directory")); + } + for _ in 0 .. number_of_files { let file = try!(central_header_to_zip_file(&mut reader, archive_offset));