Commit b8d58650 authored by Dmitry Timoshkov's avatar Dmitry Timoshkov Committed by Alexandre Julliard

windowscodecs: Handle IFD fields with count 0 same way as with count 1.

parent e4af117c
......@@ -718,6 +718,8 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
{
case IFD_BYTE:
case IFD_SBYTE:
if (!count) count = 1;
if (count <= 4)
{
const BYTE *data = (const BYTE *)&entry->value;
......@@ -755,6 +757,8 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
break;
case IFD_SHORT:
case IFD_SSHORT:
if (!count) count = 1;
if (count <= 2)
{
const SHORT *data = (const SHORT *)&entry->value;
......@@ -800,6 +804,8 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
case IFD_LONG:
case IFD_SLONG:
case IFD_FLOAT:
if (!count) count = 1;
if (count == 1)
{
item->value.u.ulVal = value;
......@@ -830,6 +836,13 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
case IFD_RATIONAL:
case IFD_SRATIONAL:
case IFD_DOUBLE:
if (!count)
{
FIXME("IFD field type %d, count 0\n", type);
item->value.vt = VT_EMPTY;
break;
}
if (count == 1)
{
ULONGLONG ull;
......@@ -882,6 +895,13 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
item->value.u.pszVal[count] = 0;
break;
case IFD_UNDEFINED:
if (!count)
{
FIXME("IFD field type %d, count 0\n", type);
item->value.vt = VT_EMPTY;
break;
}
item->value.u.blob.pBlobData = HeapAlloc(GetProcessHeap(), 0, count);
if (!item->value.u.blob.pBlobData) return E_OUTOFMEMORY;
......
......@@ -82,7 +82,7 @@ static const struct ifd_data
FLOAT float_val[2];
} IFD_data =
{
23,
27,
{
{ 0xfe, IFD_SHORT, 1, 1 }, /* NEWSUBFILETYPE */
{ 0x100, IFD_LONG, 1, 222 }, /* IMAGEWIDTH */
......@@ -107,6 +107,10 @@ static const struct ifd_data
{ 0xf00f, IFD_ASCII, 4, 'a' | 'b' << 8 | 'c' << 16 | 'd' << 24 },
{ 0xf010, IFD_UNDEFINED, 13, FIELD_OFFSET(struct ifd_data, string) },
{ 0xf011, IFD_UNDEFINED, 4, 'a' | 'b' << 8 | 'c' << 16 | 'd' << 24 },
{ 0xf012, IFD_BYTE, 0, 0x11223344 },
{ 0xf013, IFD_SHORT, 0, 0x11223344 },
{ 0xf014, IFD_LONG, 0, 0x11223344 },
{ 0xf015, IFD_FLOAT, 0, 0x11223344 },
},
0,
{ 900, 3 },
......@@ -390,7 +394,7 @@ static void test_metadata_IFD(void)
int count; /* if VT_VECTOR */
LONGLONG value[13];
const char *string;
} td[23] =
} td[27] =
{
{ VT_UI2, 0xfe, 0, { 1 } },
{ VT_UI4, 0x100, 0, { 222 } },
......@@ -415,6 +419,10 @@ static void test_metadata_IFD(void)
{ VT_LPSTR, 0xf00f, 4, { 0 }, "abcd" },
{ VT_BLOB, 0xf010, 13, { 0 }, "Hello World!" },
{ VT_BLOB, 0xf011, 4, { 0 }, "abcd" },
{ VT_UI1, 0xf012, 0, { 0x44 } },
{ VT_UI2, 0xf013, 0, { 0x3344 } },
{ VT_UI4, 0xf014, 0, { 0x11223344 } },
{ VT_R4, 0xf015, 0, { 0x11223344 } },
};
HRESULT hr;
IWICMetadataReader *reader;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment