From 7916c171c171046466911d2ee02e051d17c0dac5 Mon Sep 17 00:00:00 2001 From: morkt Date: Mon, 7 Dec 2015 00:00:47 +0400 Subject: [PATCH] (Xp3Stream): fixed compressed segments reading. bug prevented decompression when compressed size was larger than original. --- ArcFormats/KiriKiri/ArcXP3.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ArcFormats/KiriKiri/ArcXP3.cs b/ArcFormats/KiriKiri/ArcXP3.cs index 642cceb4..36cca0bd 100644 --- a/ArcFormats/KiriKiri/ArcXP3.cs +++ b/ArcFormats/KiriKiri/ArcXP3.cs @@ -673,7 +673,8 @@ NextEntry: if (null != m_stream) m_stream.Dispose(); var segment = m_segment.Current; - m_stream = m_file.CreateStream (segment.Offset, segment.Size); + var segment_size = segment.IsCompressed ? segment.PackedSize : segment.Size; + m_stream = m_file.CreateStream (segment.Offset, segment_size); if (segment.IsCompressed) m_stream = new ZLibStream (m_stream, CompressionMode.Decompress); } @@ -684,11 +685,14 @@ NextEntry: while (!m_eof && count > 0) { int read = m_stream.Read (buffer, offset, count); - m_entry.Cipher.Decrypt (m_entry, m_offset, buffer, offset, read); - m_offset += read; - total += read; - offset += read; - count -= read; + if (0 != read) + { + m_entry.Cipher.Decrypt (m_entry, m_offset, buffer, offset, read); + m_offset += read; + total += read; + offset += read; + count -= read; + } if (0 != count) NextSegment(); }