From 12e5aee8b16721826d399779b6a6fdd60d45f47d Mon Sep 17 00:00:00 2001 From: Jaby Date: Thu, 24 Nov 2022 03:36:56 +0100 Subject: [PATCH] Rename extended size to padded size and implement validation --- src/Tools/psxcdgen_ex/src/encoder/psx.rs | 23 ++++++++++++++++++----- src/Tools/psxcdgen_ex/src/types/mod.rs | 22 +++++++++++++--------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/Tools/psxcdgen_ex/src/encoder/psx.rs b/src/Tools/psxcdgen_ex/src/encoder/psx.rs index 72ee0daa..3edb45d0 100644 --- a/src/Tools/psxcdgen_ex/src/encoder/psx.rs +++ b/src/Tools/psxcdgen_ex/src/encoder/psx.rs @@ -49,7 +49,7 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { Layout::Directory(dir) => { let dir = dir.borrow_mut(); let mut properties = dir.properties.borrow_mut(); - let sector_count = sector_count_mode2_form1(properties.get_extended_size()); + let sector_count = sector_count_mode2_form1(properties.get_padded_size()); cd_desc.vol_sector_count += sector_count; if properties.is_hidden { @@ -64,7 +64,7 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { Layout::File(file) => { let sector_count = { let file = file.borrow(); - let fake_size = file.properties.get_extended_size(); + let fake_size = file.properties.get_padded_size(); sector_count_mode2_form1(fake_size) }; @@ -270,7 +270,12 @@ fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter) return Ok(()); } - let mut dir_record = vec![0u8; dir.properties.borrow().get_real_size()]; + let properties = dir.properties.borrow(); + if !properties.is_size_valid() { + return Err(create_wrong_padding_error("Dir", dir.name.to_string(), properties.get_padded_size(), properties.get_real_size())); + } + + let mut dir_record = vec![0u8; properties.get_real_size()]; let dir_length = dir_record.len(); let mut raw_data = &mut dir_record[0..dir_length]; @@ -293,7 +298,7 @@ fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter) sec_writer.write_cd_xa_data(sector)?; } - let extended_sector_count = sector_count_mode2_form1(dir.properties.borrow().get_extended_size()) - dir_record_sector_count; + let extended_sector_count = sector_count_mode2_form1(dir.properties.borrow().get_padded_size()) - dir_record_sector_count; for _ in 0..extended_sector_count { sec_writer.write_cd_xa_data(builder::create_xa_data_zero())?; } @@ -302,6 +307,10 @@ fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter) } fn process_file(file: &File, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> { + if !file.properties.is_size_valid() { + return Err(create_wrong_padding_error("File", file.name.to_string(), file.properties.get_padded_size(), file.properties.get_real_size())); + } + let content_sectors = { match &file.content { FileType::Regular(raw) => builder::create_xa_data_for_vec(None, raw), @@ -313,7 +322,7 @@ fn process_file(file: &File, sec_writer: &mut dyn SectorWriter) -> Result<(), Er sec_writer.write_cd_xa_data(sector)?; } - let extended_sector_count = sector_count_mode2_form1(file.properties.get_extended_size()) - content_sector_count; + let extended_sector_count = sector_count_mode2_form1(file.properties.get_padded_size()) - content_sector_count; for _ in 0..extended_sector_count { sec_writer.write_cd_xa_data(builder::create_xa_data_zero())?; } @@ -429,4 +438,8 @@ fn write_dir_record(dir_record: &mut [u8], dir_member: &DirectoryRecordMember, h return Ok(dir_record.length[0] as usize); } } +} + +fn create_wrong_padding_error(for_who: &str, name: String, padded_size: usize, real_size: usize) -> Error { + Error::from_text(format!("Encoding-Error for {} {}: Padded size ({}) is smaller then the original size ({}).", for_who, name, padded_size, real_size)) } \ No newline at end of file diff --git a/src/Tools/psxcdgen_ex/src/types/mod.rs b/src/Tools/psxcdgen_ex/src/types/mod.rs index efe422b9..286e22c5 100644 --- a/src/Tools/psxcdgen_ex/src/types/mod.rs +++ b/src/Tools/psxcdgen_ex/src/types/mod.rs @@ -139,7 +139,7 @@ impl Directory { } pub fn get_extended_size(&self) -> usize { - self.properties.borrow().get_extended_size() + self.properties.borrow().get_padded_size() } pub(super) fn collect_member(&self) -> Vec{ @@ -196,7 +196,7 @@ impl File { } pub fn get_extended_size(&self) -> usize { - self.properties.get_extended_size() + self.properties.get_padded_size() } } @@ -274,15 +274,15 @@ impl std::fmt::Display for FileName { } pub struct Properties { - pub(super) track_rel_lba: usize, - pub(super) size_bytes: usize, - pub(super) overwrite_size_bytes: Option, - pub(super) is_hidden: bool + pub(super) track_rel_lba: usize, + pub(super) size_bytes: usize, + pub(super) padded_size_bytes: Option, + pub(super) is_hidden: bool } impl Properties { - pub(super) fn get_extended_size(&self) -> usize { - if let Some(forced_bytes) = self.overwrite_size_bytes { + pub(super) fn get_padded_size(&self) -> usize { + if let Some(forced_bytes) = self.padded_size_bytes { forced_bytes } @@ -294,11 +294,15 @@ impl Properties { pub(super) fn get_real_size(&self) -> usize { self.size_bytes } + + pub fn is_size_valid(&self) -> bool { + self.get_padded_size() >= self.size_bytes + } } impl Default for Properties { fn default() -> Self { - Properties{track_rel_lba: 0, size_bytes: 0, overwrite_size_bytes: None, is_hidden: false} + Properties{track_rel_lba: 0, size_bytes: 0, padded_size_bytes: None, is_hidden: false} } }