windowscodecs/tests: Add some tests for loading truncated GIF images.
This commit is contained in:
parent
f78a6dd15c
commit
51a3bc2d9d
|
@ -1055,10 +1055,13 @@ static ULONG WINAPI GifDecoder_Release(IWICBitmapDecoder *iface)
|
||||||
|
|
||||||
if (ref == 0)
|
if (ref == 0)
|
||||||
{
|
{
|
||||||
IStream_Release(This->stream);
|
if (This->stream)
|
||||||
|
{
|
||||||
|
IStream_Release(This->stream);
|
||||||
|
DGifCloseFile(This->gif);
|
||||||
|
}
|
||||||
This->lock.DebugInfo->Spare[0] = 0;
|
This->lock.DebugInfo->Spare[0] = 0;
|
||||||
DeleteCriticalSection(&This->lock);
|
DeleteCriticalSection(&This->lock);
|
||||||
DGifCloseFile(This->gif);
|
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1435,6 +1438,7 @@ HRESULT GifDecoder_CreateInstance(REFIID iid, void** ppv)
|
||||||
|
|
||||||
This->IWICBitmapDecoder_iface.lpVtbl = &GifDecoder_Vtbl;
|
This->IWICBitmapDecoder_iface.lpVtbl = &GifDecoder_Vtbl;
|
||||||
This->IWICMetadataBlockReader_iface.lpVtbl = &GifDecoder_BlockVtbl;
|
This->IWICMetadataBlockReader_iface.lpVtbl = &GifDecoder_BlockVtbl;
|
||||||
|
This->stream = NULL;
|
||||||
This->ref = 1;
|
This->ref = 1;
|
||||||
This->initialized = FALSE;
|
This->initialized = FALSE;
|
||||||
This->gif = NULL;
|
This->gif = NULL;
|
||||||
|
|
|
@ -80,15 +80,12 @@ static const char gif_frame_sizes[] = {
|
||||||
|
|
||||||
static IWICImagingFactory *factory;
|
static IWICImagingFactory *factory;
|
||||||
|
|
||||||
static IWICBitmapDecoder *create_decoder(const void *image_data, UINT image_size)
|
static IStream *create_stream(const void *image_data, UINT image_size)
|
||||||
{
|
{
|
||||||
HGLOBAL hmem;
|
HGLOBAL hmem;
|
||||||
BYTE *data;
|
BYTE *data;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
IWICBitmapDecoder *decoder = NULL;
|
|
||||||
IStream *stream;
|
IStream *stream;
|
||||||
GUID format;
|
|
||||||
LONG refcount;
|
|
||||||
|
|
||||||
hmem = GlobalAlloc(0, image_size);
|
hmem = GlobalAlloc(0, image_size);
|
||||||
data = GlobalLock(hmem);
|
data = GlobalLock(hmem);
|
||||||
|
@ -98,6 +95,20 @@ static IWICBitmapDecoder *create_decoder(const void *image_data, UINT image_size
|
||||||
hr = CreateStreamOnHGlobal(hmem, TRUE, &stream);
|
hr = CreateStreamOnHGlobal(hmem, TRUE, &stream);
|
||||||
ok(hr == S_OK, "CreateStreamOnHGlobal error %#x\n", hr);
|
ok(hr == S_OK, "CreateStreamOnHGlobal error %#x\n", hr);
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IWICBitmapDecoder *create_decoder(const void *image_data, UINT image_size)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
IWICBitmapDecoder *decoder;
|
||||||
|
IStream *stream;
|
||||||
|
GUID format;
|
||||||
|
LONG refcount;
|
||||||
|
|
||||||
|
stream = create_stream(image_data, image_size);
|
||||||
|
if (!stream) return NULL;
|
||||||
|
|
||||||
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||||
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||||
|
|
||||||
|
@ -402,6 +413,92 @@ static void test_gif_frame_sizes(void)
|
||||||
IWICBitmapDecoder_Release(decoder);
|
IWICBitmapDecoder_Release(decoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char gif_with_trailer_1[] = {
|
||||||
|
/* LSD */'G','I','F','8','7','a',0x01,0x00,0x01,0x00,0x80,0x00,0x00,
|
||||||
|
/* palette */0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
/* IMD */0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,
|
||||||
|
/* image data */0x02,0x02,0x44,0x01,0x00,0x3b
|
||||||
|
};
|
||||||
|
static const char gif_with_trailer_2[] = {
|
||||||
|
/* LSD */'G','I','F','8','7','a',0x01,0x00,0x01,0x00,0x00,0x00,0x00,
|
||||||
|
/* IMD */0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,
|
||||||
|
/* image data */0x02,0x02,0x44,0x3b
|
||||||
|
};
|
||||||
|
static const char gif_without_trailer_1[] = {
|
||||||
|
/* LSD */'G','I','F','8','7','a',0x01,0x00,0x01,0x00,0x80,0x00,0x00,
|
||||||
|
/* palette */0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
/* IMD */0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,
|
||||||
|
/* image data */0x02,0x02,0x44,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char gif_without_trailer_2[] = {
|
||||||
|
/* LSD */'G','I','F','8','7','a',0x01,0x00,0x01,0x00,0x00,0x00,0x00,
|
||||||
|
/* IMD */0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,
|
||||||
|
/* image data */0x02,0x02,0x44,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef
|
||||||
|
};
|
||||||
|
|
||||||
|
static void test_truncated_gif(void)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
IStream *stream;
|
||||||
|
IWICBitmapDecoder *decoder;
|
||||||
|
GUID format;
|
||||||
|
|
||||||
|
stream = create_stream(gif_with_trailer_1, sizeof(gif_with_trailer_1));
|
||||||
|
if (!stream) return;
|
||||||
|
|
||||||
|
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||||
|
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||||
|
hr = IWICBitmapDecoder_GetContainerFormat(decoder, &format);
|
||||||
|
ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
|
||||||
|
ok(IsEqualGUID(&format, &GUID_ContainerFormatGif),
|
||||||
|
"wrong container format %s\n", wine_dbgstr_guid(&format));
|
||||||
|
IWICBitmapDecoder_Release(decoder);
|
||||||
|
IStream_Release(stream);
|
||||||
|
|
||||||
|
stream = create_stream(gif_with_trailer_2, sizeof(gif_with_trailer_2));
|
||||||
|
if (!stream) return;
|
||||||
|
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||||
|
todo_wine
|
||||||
|
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||||
|
if (hr != S_OK) goto skip_1;
|
||||||
|
hr = IWICBitmapDecoder_GetContainerFormat(decoder, &format);
|
||||||
|
ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
|
||||||
|
ok(IsEqualGUID(&format, &GUID_ContainerFormatGif),
|
||||||
|
"wrong container format %s\n", wine_dbgstr_guid(&format));
|
||||||
|
IWICBitmapDecoder_Release(decoder);
|
||||||
|
skip_1:
|
||||||
|
IStream_Release(stream);
|
||||||
|
|
||||||
|
stream = create_stream(gif_without_trailer_1, sizeof(gif_without_trailer_1));
|
||||||
|
if (!stream) return;
|
||||||
|
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||||
|
todo_wine
|
||||||
|
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||||
|
if (hr != S_OK) goto skip_2;
|
||||||
|
hr = IWICBitmapDecoder_GetContainerFormat(decoder, &format);
|
||||||
|
ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
|
||||||
|
ok(IsEqualGUID(&format, &GUID_ContainerFormatGif),
|
||||||
|
"wrong container format %s\n", wine_dbgstr_guid(&format));
|
||||||
|
IWICBitmapDecoder_Release(decoder);
|
||||||
|
skip_2:
|
||||||
|
IStream_Release(stream);
|
||||||
|
|
||||||
|
stream = create_stream(gif_without_trailer_2, sizeof(gif_without_trailer_2));
|
||||||
|
if (!stream) return;
|
||||||
|
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||||
|
todo_wine
|
||||||
|
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||||
|
if (hr != S_OK) goto skip_3;
|
||||||
|
hr = IWICBitmapDecoder_GetContainerFormat(decoder, &format);
|
||||||
|
ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
|
||||||
|
ok(IsEqualGUID(&format, &GUID_ContainerFormatGif),
|
||||||
|
"wrong container format %s\n", wine_dbgstr_guid(&format));
|
||||||
|
IWICBitmapDecoder_Release(decoder);
|
||||||
|
skip_3:
|
||||||
|
IStream_Release(stream);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(gifformat)
|
START_TEST(gifformat)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -428,6 +525,7 @@ START_TEST(gifformat)
|
||||||
test_global_gif_palette_2frames();
|
test_global_gif_palette_2frames();
|
||||||
test_local_gif_palette();
|
test_local_gif_palette();
|
||||||
test_gif_frame_sizes();
|
test_gif_frame_sizes();
|
||||||
|
test_truncated_gif();
|
||||||
|
|
||||||
IWICImagingFactory_Release(factory);
|
IWICImagingFactory_Release(factory);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue