From f98a32ad471e95ab2c70563b24d5a0a1368439ad Mon Sep 17 00:00:00 2001 From: Ziqing Hui Date: Wed, 15 Jul 2020 22:01:14 +0800 Subject: [PATCH] windowscodecs: Return fail for unsupported format in DdsDecoder_Initialize(). Signed-off-by: Ziqing Hui Signed-off-by: Esme Povirk Signed-off-by: Alexandre Julliard --- dlls/windowscodecs/ddsformat.c | 18 +++++++++++++++++- dlls/windowscodecs/tests/ddsformat.c | 3 --- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/dlls/windowscodecs/ddsformat.c b/dlls/windowscodecs/ddsformat.c index f7b5201321c..bbd30a90d27 100644 --- a/dlls/windowscodecs/ddsformat.c +++ b/dlls/windowscodecs/ddsformat.c @@ -626,10 +626,26 @@ static HRESULT WINAPI DdsDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p WICDecodeOptions cacheOptions) { DdsDecoder *This = impl_from_IWICBitmapDecoder(iface); + HRESULT hr; TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); - return IWICWineDecoder_Initialize(&This->IWICWineDecoder_iface, pIStream, cacheOptions); + EnterCriticalSection(&This->lock); + + hr = IWICWineDecoder_Initialize(&This->IWICWineDecoder_iface, pIStream, cacheOptions); + if (FAILED(hr)) goto end; + + if (!This->info.compressed || This->info.dimension == WICDdsTextureCube) { + IStream_Release(pIStream); + This->stream = NULL; + This->initialized = FALSE; + hr = WINCODEC_ERR_BADHEADER; + } + +end: + LeaveCriticalSection(&This->lock); + + return hr; } static HRESULT WINAPI DdsDecoder_GetContainerFormat(IWICBitmapDecoder *iface, diff --git a/dlls/windowscodecs/tests/ddsformat.c b/dlls/windowscodecs/tests/ddsformat.c index ecf7de0bc48..32a854fbb0c 100644 --- a/dlls/windowscodecs/tests/ddsformat.c +++ b/dlls/windowscodecs/tests/ddsformat.c @@ -237,7 +237,6 @@ static HRESULT init_decoder(IWICBitmapDecoder *decoder, IWICStream *stream, HRES if (index == -1) { ok(hr == S_OK, "Decoder initialize failed, hr %#x\n", hr); } else { - todo_wine_if(wine_init) ok(hr == expected, "Test %u: Expected hr %#x, got %#x\n", index, expected, hr); } @@ -251,10 +250,8 @@ static HRESULT init_decoder(IWICBitmapDecoder *decoder, IWICStream *stream, HRES if (hr == S_OK) { hr = IWICWineDecoder_Initialize(wine_decoder, (IStream*)stream, WICDecodeMetadataCacheOnDemand); if (index == -1) { - todo_wine ok(hr == S_OK, "Initialize failed, hr %#x\n", hr); } else { - todo_wine ok(hr == S_OK, "Test %u: Initialize failed, hr %#x\n", index, hr); }