From a1ac261ce71037416748de120471474e6d5a0695 Mon Sep 17 00:00:00 2001 From: morkt Date: Sun, 10 Jan 2016 02:29:20 +0400 Subject: [PATCH] fixed reading of AST index with zero-length entries. --- ArcFormats/ArcAST.cs | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/ArcFormats/ArcAST.cs b/ArcFormats/ArcAST.cs index cb2178b4..b27a2f49 100644 --- a/ArcFormats/ArcAST.cs +++ b/ArcFormats/ArcAST.cs @@ -2,7 +2,7 @@ //! \date Tue Apr 21 02:24:20 2015 //! \brief AST script engine resource archives. // -// Copyright (C) 2015 by morkt +// Copyright (C) 2015-2016 by morkt // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to @@ -73,27 +73,35 @@ namespace GameRes.Formats.AST if (name_length > name_buf.Length) name_buf = new byte[name_length]; file.View.Read (index_offset+9, name_buf, 0, (uint)name_length); - if (2 == version) - for (int j = 0; j < name_length; ++j) - name_buf[j] ^= 0xff; if (i+1 == count) next_offset = (uint)file.MaxOffset; else next_offset = file.View.ReadUInt32 (index_offset+9+name_length); - if (next_offset < offset) - return null; - string name = Encodings.cp932.GetString (name_buf, 0, name_length); - var entry = new PackedEntry + if (0 != offset && offset != file.MaxOffset) { - Name = name, - Type = FormatCatalog.Instance.GetTypeFromName (name), - Offset = offset, - Size = next_offset - offset, - UnpackedSize = size, - }; - if (!entry.CheckPlacement (file.MaxOffset)) - return null; - dir.Add (entry); + if (2 == version) + for (int j = 0; j < name_length; ++j) + name_buf[j] ^= 0xff; + uint packed_size; + if (0 == next_offset) + packed_size = size; + else if (next_offset >= offset) + packed_size = next_offset - offset; + else + return null; + string name = Encodings.cp932.GetString (name_buf, 0, name_length); + var entry = new PackedEntry + { + Name = name, + Type = FormatCatalog.Instance.GetTypeFromName (name), + Offset = offset, + Size = packed_size, + UnpackedSize = size, + }; + if (!entry.CheckPlacement (file.MaxOffset)) + return null; + dir.Add (entry); + } index_offset += 9 + name_length; } if (2 == version)