Ensure we do not leak bitmaps when parsing invalid PNG files.
This commit is contained in:
@@ -42,6 +42,8 @@ namespace OpenRA.FileFormats
|
|||||||
Color[] palette = null;
|
Color[] palette = null;
|
||||||
var data = new List<byte>();
|
var data = new List<byte>();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
var length = IPAddress.NetworkToHostOrder(br.ReadInt32());
|
var length = IPAddress.NetworkToHostOrder(br.ReadInt32());
|
||||||
@@ -49,12 +51,18 @@ namespace OpenRA.FileFormats
|
|||||||
var content = br.ReadBytes(length);
|
var content = br.ReadBytes(length);
|
||||||
/*var crc = */br.ReadInt32();
|
/*var crc = */br.ReadInt32();
|
||||||
|
|
||||||
|
if (bitmap == null && type != "IHDR")
|
||||||
|
throw new InvalidDataException("Invalid PNG file - header does not appear first.");
|
||||||
|
|
||||||
using (var ms = new MemoryStream(content))
|
using (var ms = new MemoryStream(content))
|
||||||
using (var cr = new BinaryReader(ms))
|
using (var cr = new BinaryReader(ms))
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case "IHDR":
|
case "IHDR":
|
||||||
{
|
{
|
||||||
|
if (bitmap != null)
|
||||||
|
throw new InvalidDataException("Invalid PNG file - duplicate header.");
|
||||||
|
|
||||||
var width = IPAddress.NetworkToHostOrder(cr.ReadInt32());
|
var width = IPAddress.NetworkToHostOrder(cr.ReadInt32());
|
||||||
var height = IPAddress.NetworkToHostOrder(cr.ReadInt32());
|
var height = IPAddress.NetworkToHostOrder(cr.ReadInt32());
|
||||||
var bitDepth = cr.ReadByte();
|
var bitDepth = cr.ReadByte();
|
||||||
@@ -103,9 +111,6 @@ namespace OpenRA.FileFormats
|
|||||||
|
|
||||||
case "IEND":
|
case "IEND":
|
||||||
{
|
{
|
||||||
if (bitmap == null)
|
|
||||||
throw new InvalidDataException("Image header not found.");
|
|
||||||
|
|
||||||
var bits = bitmap.LockBits(bitmap.Bounds(),
|
var bits = bitmap.LockBits(bitmap.Bounds(),
|
||||||
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
|
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
|
||||||
|
|
||||||
@@ -152,6 +157,13 @@ namespace OpenRA.FileFormats
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
if (bitmap != null)
|
||||||
|
bitmap.Dispose();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static byte UnapplyFilter(PngFilter f, byte x, byte a, byte b, byte c)
|
static byte UnapplyFilter(PngFilter f, byte x, byte a, byte b, byte c)
|
||||||
|
|||||||
Reference in New Issue
Block a user