Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/windirstat/ntfs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Finck <colin@reactos.org>2021-08-25 17:35:58 +0300
committerColin Finck <colin@reactos.org>2021-08-25 17:35:58 +0300
commitb82f50ac7445b690c736ecb42f41d24a3ddc3ba1 (patch)
tree6a985338e416eff9a00678a05adba13947da5303
parentff2110ef9541e8d895a393d53fe2e487071bc520 (diff)
Validate signatures before record fixup to catch invalid positions early
-rw-r--r--src/file.rs8
-rw-r--r--src/index_record.rs8
2 files changed, 8 insertions, 8 deletions
diff --git a/src/file.rs b/src/file.rs
index 9307f87..16f791c 100644
--- a/src/file.rs
+++ b/src/file.rs
@@ -68,10 +68,10 @@ impl<'n> NtfsFile<'n> {
fs.read_exact(&mut data)?;
let mut record = Record::new(ntfs, data, position);
+ Self::validate_signature(&record)?;
record.fixup()?;
let file = Self { record };
- file.validate_signature()?;
file.validate_sizes()?;
Ok(file)
@@ -243,15 +243,15 @@ impl<'n> NtfsFile<'n> {
LittleEndian::read_u32(&self.record.data()[start..])
}
- fn validate_signature(&self) -> Result<()> {
- let signature = &self.record.signature();
+ fn validate_signature(record: &Record) -> Result<()> {
+ let signature = &record.signature();
let expected = b"FILE";
if signature == expected {
Ok(())
} else {
Err(NtfsError::InvalidFileSignature {
- position: self.record.position(),
+ position: record.position(),
expected,
actual: *signature,
})
diff --git a/src/index_record.rs b/src/index_record.rs
index e0fab4f..ddec81a 100644
--- a/src/index_record.rs
+++ b/src/index_record.rs
@@ -58,10 +58,10 @@ impl<'n> NtfsIndexRecord<'n> {
value.read_exact(fs, &mut data)?;
let mut record = Record::new(value.ntfs(), data, data_position);
+ Self::validate_signature(&record)?;
record.fixup()?;
let index_record = Self { record };
- index_record.validate_signature()?;
index_record.validate_sizes()?;
Ok(index_record)
@@ -116,15 +116,15 @@ impl<'n> NtfsIndexRecord<'n> {
IndexNodeEntryRanges::new(self.record.into_data(), entries_range, position)
}
- fn validate_signature(&self) -> Result<()> {
- let signature = &self.record.signature();
+ fn validate_signature(record: &Record) -> Result<()> {
+ let signature = &record.signature();
let expected = b"INDX";
if signature == expected {
Ok(())
} else {
Err(NtfsError::InvalidIndexSignature {
- position: self.record.position(),
+ position: record.position(),
expected,
actual: *signature,
})