From bf676b9198feef5e46e5c6d97dd31fed4c73caf4 Mon Sep 17 00:00:00 2001 From: morkt Date: Wed, 23 Dec 2015 09:42:08 +0400 Subject: [PATCH] (ReadIndexV2): use Binary.GetCString instead of ArcView.ReadString. temporary buffer allocation within ArcView.ReadString makes reading of large indices (20000+ entries) somewhat slow. --- ArcFormats/Escude/ArcBIN.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ArcFormats/Escude/ArcBIN.cs b/ArcFormats/Escude/ArcBIN.cs index b65da9f5..cb9c38e3 100644 --- a/ArcFormats/Escude/ArcBIN.cs +++ b/ArcFormats/Escude/ArcBIN.cs @@ -103,14 +103,21 @@ namespace GameRes.Formats.Escude var index = m_file.View.ReadBytes (0x14, index_size); if (index.Length != index_size) return null; + uint filenames_base = 0x14 + index_size; + var names = m_file.View.ReadBytes (filenames_base, names_size); + if (names.Length != names_size) + return null; Decrypt (index); int index_offset = 0; - uint filenames_base = 0x14 + index_size; var dir = new List ((int)m_count); for (uint i = 0; i < m_count; ++i) { - uint filename_offset = LittleEndian.ToUInt32 (index, index_offset); - var name = m_file.View.ReadString (filenames_base+filename_offset, names_size-filename_offset); + int filename_offset = LittleEndian.ToInt32 (index, index_offset); + if (filename_offset < 0 || filename_offset >= names.Length) + return null; + var name = Binary.GetCString (names, filename_offset, names.Length-filename_offset); + if (0 == name.Length) + return null; var entry = FormatCatalog.Instance.Create (name); entry.Offset = LittleEndian.ToUInt32 (index, index_offset+4); entry.Size = LittleEndian.ToUInt32 (index, index_offset+8);