aboutsummaryrefslogtreecommitdiff
path: root/crates/nres/src/lib.rs
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-02-10 11:57:00 +0300
committerValentin Popov <valentin@popov.link>2026-02-10 11:57:00 +0300
commitba1789f10607f5a6cba5863128d31f776b8e59cc (patch)
treecc090228196bddc5a700c5ec32ec61f53c44a4b4 /crates/nres/src/lib.rs
parent842f4a85693b418af81560738aa3136ac500d9b1 (diff)
downloadfparkan-ba1789f10607f5a6cba5863128d31f776b8e59cc.tar.xz
fparkan-ba1789f10607f5a6cba5863128d31f776b8e59cc.zip
fix: обработка выхода за пределы индекса сортировки в архиве и улучшение декодирования LZSS с поддержкой XOR
Diffstat (limited to 'crates/nres/src/lib.rs')
-rw-r--r--crates/nres/src/lib.rs9
1 files changed, 7 insertions, 2 deletions
diff --git a/crates/nres/src/lib.rs b/crates/nres/src/lib.rs
index 0cd9e22..1fa3b39 100644
--- a/crates/nres/src/lib.rs
+++ b/crates/nres/src/lib.rs
@@ -111,7 +111,9 @@ impl Archive {
let mut high = self.entries.len();
while low < high {
let mid = low + (high - low) / 2;
- let target_idx = self.entries[mid].meta.sort_index as usize;
+ let Ok(target_idx) = usize::try_from(self.entries[mid].meta.sort_index) else {
+ break;
+ };
if target_idx >= self.entries.len() {
break;
}
@@ -396,7 +398,10 @@ fn parse_archive(bytes: &[u8], raw_mode: bool) -> Result<(Vec<EntryRecord>, u64)
name
},
};
- return Ok((vec![entry], bytes.len() as u64));
+ return Ok((
+ vec![entry],
+ u64::try_from(bytes.len()).map_err(|_| Error::IntegerOverflow)?,
+ ));
}
if bytes.len() < 16 {