From ea245a054dff468c6d5b1bbb19c1eb67c2cccec6 Mon Sep 17 00:00:00 2001 From: morkt Date: Sat, 1 Aug 2015 18:32:42 +0400 Subject: [PATCH] (PakOpener): sanity checks. --- ArcFormats/ArcHED.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ArcFormats/ArcHED.cs b/ArcFormats/ArcHED.cs index 2d6d9418..5d5e5bd6 100644 --- a/ArcFormats/ArcHED.cs +++ b/ArcFormats/ArcHED.cs @@ -50,7 +50,7 @@ namespace GameRes.Formats.Elf public override ArcFile TryOpen (ArcView file) { string pak_name = Path.ChangeExtension (file.Name, "pak"); - if (!File.Exists (pak_name)) + if (pak_name == file.Name || !File.Exists (pak_name)) return null; var file_map = GetFileMap (pak_name); if (null == file_map) @@ -66,16 +66,16 @@ namespace GameRes.Formats.Elf return null; List dir; if ("cg" == base_name) - dir = ReadCgPak (pak, file_map); + dir = ReadCgPak (pak, file, file_map); else - dir = ReadVoicePak (pak, file_map); + dir = ReadVoicePak (pak, file, file_map); if (null == dir) return null; return new ArcFile (file, this, dir); } } - List ReadCgPak (ArcView pak, List file_map) + List ReadCgPak (ArcView pak, ArcView bin, List file_map) { uint index_offset = 8; uint index_size = (uint)file_map.Count * 8u; @@ -87,13 +87,15 @@ namespace GameRes.Formats.Elf var entry = FormatCatalog.Instance.CreateEntry (file_map[i]); entry.Offset = pak.View.ReadUInt32 (index_offset); entry.Size = pak.View.ReadUInt32 (index_offset + 4); + if (!entry.CheckPlacement (bin.MaxOffset)) + return null; dir.Add (entry); index_offset += 8; } return dir; } - List ReadVoicePak (ArcView pak, List file_map) + List ReadVoicePak (ArcView pak, ArcView bin, List file_map) { uint index_offset = 8; uint index_size = (uint)file_map.Count * 0x18u; @@ -105,6 +107,8 @@ namespace GameRes.Formats.Elf var entry = FormatCatalog.Instance.CreateEntry (file_map[i]); entry.Offset = pak.View.ReadUInt32 (index_offset); entry.Size = pak.View.ReadUInt32 (index_offset + 4); + if (!entry.CheckPlacement (bin.MaxOffset)) + return null; dir.Add (entry); index_offset += 0x18; }