diff --git a/src/read/magic_finder.rs b/src/read/magic_finder.rs index e516d8c2..a1b47903 100644 --- a/src/read/magic_finder.rs +++ b/src/read/magic_finder.rs @@ -7,7 +7,7 @@ use crate::result::ZipResult; pub trait FinderDirection<'a> { fn new(needle: &'a [u8]) -> Self; fn reset_cursor(bounds: (u64, u64), window_size: usize) -> u64; - fn scope_window(window: &[u8], mid_window_offset: usize) -> &[u8]; + fn scope_window(window: &[u8], mid_window_offset: usize) -> (&[u8], usize); fn needle(&self) -> &[u8]; fn find(&self, haystack: &[u8]) -> Option; @@ -25,8 +25,8 @@ impl<'a> FinderDirection<'a> for Forward<'a> { start_inclusive } - fn scope_window(window: &[u8], mid_window_offset: usize) -> &[u8] { - &window[mid_window_offset..] + fn scope_window(window: &[u8], mid_window_offset: usize) -> (&[u8], usize) { + (&window[mid_window_offset..], mid_window_offset) } fn find(&self, haystack: &[u8]) -> Option { @@ -66,8 +66,8 @@ impl<'a> FinderDirection<'a> for Backwards<'a> { .clamp(bounds.0, bounds.1) } - fn scope_window(window: &[u8], mid_window_offset: usize) -> &[u8] { - &window[..mid_window_offset] + fn scope_window(window: &[u8], mid_window_offset: usize) -> (&[u8], usize) { + (&window[..mid_window_offset], 0) } fn find(&self, haystack: &[u8]) -> Option { @@ -168,16 +168,16 @@ impl<'a, T: FinderDirection<'a>> MagicFinder { reader.read_exact(window)?; } - let window = match self.mid_buffer_offset { + let (window, window_start_offset) = match self.mid_buffer_offset { Some(mid_buffer_offset) => T::scope_window(window, mid_buffer_offset), - None => window, + None => (&*window, 0usize), }; if let Some(offset) = self.finder.find(window) { - let magic_pos = window_start + offset as u64; + let magic_pos = window_start + window_start_offset as u64 + offset as u64; reader.seek(SeekFrom::Start(magic_pos))?; - self.mid_buffer_offset = Some(self.finder.move_scope(offset)); + self.mid_buffer_offset = Some(self.finder.move_scope(window_start_offset + offset)); return Ok(Some(magic_pos)); } diff --git a/tests/prepended_garbage.rs b/tests/prepended_garbage.rs index 343c35a2..dad30e54 100644 --- a/tests/prepended_garbage.rs +++ b/tests/prepended_garbage.rs @@ -1,4 +1,4 @@ -use std::io; +use std::io::Cursor; use zip::ZipArchive; #[test] @@ -6,7 +6,7 @@ fn test_prepended_garbage() { let mut v = vec![0, 1, 2, 3]; v.extend_from_slice(include_bytes!("../tests/data/extended_timestamp.zip")); - let mut archive = ZipArchive::new(io::Cursor::new(v)).expect("couldn't open test zip file"); + let mut archive = ZipArchive::new(Cursor::new(v)).expect("couldn't open test zip file"); assert_eq!(2, archive.len());