(GRP): return compressed stream on decompression errors.

This commit is contained in:
morkt 2017-01-23 18:35:43 +04:00
parent 42dce0e586
commit efbac265ff

View File

@ -160,13 +160,20 @@ namespace GameRes.Formats.Ankh
var pent = entry as PackedEntry; var pent = entry as PackedEntry;
if (pent != null && pent.IsPacked && pent.Size > 8) if (pent != null && pent.IsPacked && pent.Size > 8)
{ {
if (arc.File.View.AsciiEqual (entry.Offset, "TPW")) try
return OpenTpw (arc, pent); {
if (arc.File.View.AsciiEqual (entry.Offset+4, "HDJ\0")) if (arc.File.View.AsciiEqual (entry.Offset, "TPW"))
return OpenImage (arc, pent); return OpenTpw (arc, pent);
if (entry.Size > 12 && 'W' == arc.File.View.ReadByte (entry.Offset+4) if (arc.File.View.AsciiEqual (entry.Offset+4, "HDJ\0"))
&& arc.File.View.AsciiEqual (entry.Offset+8, "RIFF")) return OpenImage (arc, pent);
return OpenAudio (arc, entry); if (entry.Size > 12 && 'W' == arc.File.View.ReadByte (entry.Offset+4)
&& arc.File.View.AsciiEqual (entry.Offset+8, "RIFF"))
return OpenAudio (arc, entry);
}
catch (Exception X)
{
System.Diagnostics.Trace.WriteLine (X.Message, "[GRP]");
}
} }
return base.OpenEntry (arc, entry); return base.OpenEntry (arc, entry);
} }
@ -340,7 +347,10 @@ namespace GameRes.Formats.Ankh
if (n != 0) if (n != 0)
count += GetBits (n) + 1; count += GetBits (n) + 1;
} }
Binary.CopyOverlapped (output, dst+offset, dst, count); int src = dst + offset;
if (src < 0)
throw new InvalidDataException();
Binary.CopyOverlapped (output, src, dst, count);
dst += count; dst += count;
} }
else else