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

github.com/windirstat/RustyMft.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatthew seyer <matthew.seyer@gmail.com>2017-04-21 08:00:37 +0300
committermatthew seyer <matthew.seyer@gmail.com>2017-04-21 08:00:37 +0300
commitb3c89de9ec4b139f96b9778b9f1c4e2ea6e823b4 (patch)
tree7ac92b14294946e0d9e6aef9c123b257792a827c
parentc103f961ffca9828fb4ce36a836ea75532df0841 (diff)
added an invalid entry signature error
-rw-r--r--src/entry.rs8
-rw-r--r--src/errors.rs9
-rw-r--r--src/main.rs9
3 files changed, 24 insertions, 2 deletions
diff --git a/src/entry.rs b/src/entry.rs
index 74f4a6c..0be1a1b 100644
--- a/src/entry.rs
+++ b/src/entry.rs
@@ -57,6 +57,14 @@ impl EntryHeader{
};
entry_header.signature = reader.read_u32::<LittleEndian>()?;
+ if entry_header.signature != 1162627398 {
+ return Err(
+ MftError::invalid_entry_signature(
+ format!("Bad signature: {:04X}",entry_header.signature)
+ )
+ );
+ }
+
entry_header.usa_offset = reader.read_u16::<LittleEndian>()?;
entry_header.usa_size = reader.read_u16::<LittleEndian>()?;
entry_header.logfile_sequence_number = reader.read_u64::<LittleEndian>()?;
diff --git a/src/errors.rs b/src/errors.rs
index 769fa94..4dc1547 100644
--- a/src/errors.rs
+++ b/src/errors.rs
@@ -6,6 +6,7 @@ use std::io;
pub enum ErrorKind {
IoError,
InvalidFileSignature,
+ InvalidEntrySignature,
Utf16Error
}
@@ -29,6 +30,14 @@ impl MftError{
}
}
#[allow(dead_code)]
+ pub fn invalid_entry_signature(err: String)->Self{
+ MftError {
+ message: format!("{}",err),
+ kind: ErrorKind::InvalidFileSignature,
+ info: Some(vec![]),
+ }
+ }
+ #[allow(dead_code)]
pub fn decode_error(err: String)->Self{
MftError {
message: format!("{}",err),
diff --git a/src/main.rs b/src/main.rs
index f5b3a19..7d24845 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,7 +4,6 @@ extern crate rwinstructs;
extern crate serde_json;
extern crate serde;
extern crate clap;
-use log::LogLevel::Debug;
use clap::{App, Arg};
use rustymft::mft::{MftHandler};
use rwinstructs::reference;
@@ -40,7 +39,13 @@ fn process_file<S: serde::ser::SerializeSeq>(filename: &str, serializer: &mut S)
};
for i in 0 .. mft_handler.get_entry_count() {
- let mft_entry = mft_handler.entry(i).unwrap();
+ let mft_entry = match mft_handler.entry(i) {
+ Ok(mft_entry) => mft_entry,
+ Err(error) => {
+ warn!("Could not parse file: {} [error: {}]", filename, error);
+ continue;
+ }
+ };
serializer.serialize_element(&mft_entry).unwrap();
}