fix: Rare bug where find_and_parse would give up prematurely on detecting a false end-of-CDR header
This commit is contained in:
parent
0513fbcc6b
commit
42972297f1
2 changed files with 22 additions and 2 deletions
|
@ -70,7 +70,9 @@ impl CentralDirectoryEnd {
|
|||
BYTES_BETWEEN_MAGIC_AND_COMMENT_SIZE as i64,
|
||||
))?;
|
||||
let cde_start_pos = reader.seek(io::SeekFrom::Start(pos))?;
|
||||
return CentralDirectoryEnd::parse(reader).map(|cde| (cde, cde_start_pos));
|
||||
if let Ok(end_header) = CentralDirectoryEnd::parse(reader) {
|
||||
return Ok((end_header, cde_start_pos));
|
||||
}
|
||||
}
|
||||
pos = match pos.checked_sub(1) {
|
||||
Some(p) => p,
|
||||
|
|
20
src/write.rs
20
src/write.rs
|
@ -1715,9 +1715,10 @@ mod test {
|
|||
use crate::result::ZipResult;
|
||||
use crate::types::DateTime;
|
||||
use crate::write::SimpleFileOptions;
|
||||
use crate::CompressionMethod::Stored;
|
||||
use crate::ZipArchive;
|
||||
use std::io;
|
||||
use std::io::{Read, Write};
|
||||
use std::io::{Cursor, Read, Write};
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[test]
|
||||
|
@ -2199,4 +2200,21 @@ mod test {
|
|||
assert_eq!(file.name(), "sleep");
|
||||
assert_eq!(file.data_start(), page_size.into());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_crash_short_read() {
|
||||
let mut writer = ZipWriter::new(Cursor::new(Vec::new()));
|
||||
let comment: Vec<u8> = vec![
|
||||
1, 80, 75, 5, 6, 237, 237, 237, 237, 237, 237, 237, 237, 44, 255, 191, 255, 255, 255,
|
||||
255, 255, 255, 255, 255, 16,
|
||||
];
|
||||
writer.set_raw_comment(comment);
|
||||
let options = SimpleFileOptions::default()
|
||||
.compression_method(Stored)
|
||||
.with_alignment(11823);
|
||||
writer.start_file("", options).unwrap();
|
||||
writer.write_all(&[255, 255, 44, 255, 0]).unwrap();
|
||||
let written = writer.finish().unwrap();
|
||||
let new_writer = ZipWriter::new_append(written).unwrap();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue