diff options
author | Colin Finck <colin@reactos.org> | 2021-06-04 12:53:34 +0300 |
---|---|---|
committer | Colin Finck <colin@reactos.org> | 2021-06-04 12:53:34 +0300 |
commit | 8206512fd216682b1e160331565a45ddc760a787 (patch) | |
tree | 7a60135c4ed5945f11ab832bc8001500c1a944da | |
parent | cba70d68b52025dda25d07e516d27ca7c73b607f (diff) |
Fix seeking non-resident values that have been seeked before.
-rw-r--r-- | src/attribute_value.rs | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/attribute_value.rs b/src/attribute_value.rs index 740be77..251a761 100644 --- a/src/attribute_value.rs +++ b/src/attribute_value.rs @@ -145,6 +145,10 @@ impl NtfsDataRun { pub fn len(&self) -> u64 { self.length } + + fn remaining_len(&self) -> u64 { + self.length.saturating_sub(self.stream_position) + } } impl NtfsReadSeek for NtfsDataRun { @@ -152,12 +156,11 @@ impl NtfsReadSeek for NtfsDataRun { where T: Read + Seek, { - let bytes_left = self.length.saturating_sub(self.stream_position); - if bytes_left == 0 { + if self.remaining_len() == 0 { return Ok(0); } - let bytes_to_read = cmp::min(buf.len(), bytes_left as usize); + let bytes_to_read = cmp::min(buf.len(), self.remaining_len() as usize); let work_slice = &mut buf[..bytes_to_read]; if self.position == 0 { @@ -387,17 +390,19 @@ impl<'n> NtfsAttributeNonResidentValue<'n> { T: Read + Seek, { let mut bytes_left_to_seek = match bytes_to_seek { - SeekFrom::Start(n) => n, + SeekFrom::Start(n) => { + // Reset `stream_data_runs` and `stream_data_run` to read from the very beginning. + self.stream_data_runs = NtfsDataRuns::new(self.ntfs, self.data_runs_range.clone()); + self.stream_data_run = None; + n + } SeekFrom::Current(n) if n >= 0 => n as u64, _ => panic!("do_seek only accepts positive seeks from Start or Current!"), }; while bytes_left_to_seek > 0 { if let Some(data_run) = &mut self.stream_data_run { - let bytes_left_in_data_run = - data_run.len().saturating_sub(data_run.stream_position()?); - - if bytes_left_to_seek < bytes_left_in_data_run { + if bytes_left_to_seek < data_run.remaining_len() { // We have found the right data run, now we have to seek inside the data run. // // If we were called to seek from the very beginning, we can be sure that this @@ -418,7 +423,7 @@ impl<'n> NtfsAttributeNonResidentValue<'n> { break; } else { // We can skip the entire data run. - bytes_left_to_seek -= data_run.len(); + bytes_left_to_seek -= data_run.remaining_len(); } } |