From 0ad6af9caa508a44fce9e0243054ea41956dac5a Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B3zef=20Kucia?= Date: Tue, 3 Jul 2012 16:06:43 +0200 Subject: [PATCH] d3dx9: Validate the size of a volume texture in D3DXGetImageInfoFromFile. --- dlls/d3dx9_36/surface.c | 9 ++++++--- dlls/d3dx9_36/tests/surface.c | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c index 845a1f70f3a..6d2e778f3a0 100644 --- a/dlls/d3dx9_36/surface.c +++ b/dlls/d3dx9_36/surface.c @@ -317,8 +317,8 @@ static HRESULT calculate_dds_surface_size(const D3DXIMAGE_INFO *img_info, static HRESULT get_image_info_from_dds(const void *buffer, UINT length, D3DXIMAGE_INFO *info) { UINT i; - UINT faces = 0; - UINT width, height; + UINT faces = 1; + UINT width, height, depth; const struct dds_header *header = buffer; UINT expected_length = 0; @@ -347,6 +347,7 @@ static HRESULT get_image_info_from_dds(const void *buffer, UINT length, D3DXIMAG else if (header->caps2 & DDS_CAPS2_CUBEMAP) { DWORD face; + faces = 0; for (face = DDS_CAPS2_CUBEMAP_POSITIVEX; face <= DDS_CAPS2_CUBEMAP_NEGATIVEZ; face <<= 1) { if (header->caps2 & face) @@ -356,20 +357,22 @@ static HRESULT get_image_info_from_dds(const void *buffer, UINT length, D3DXIMAG } else { - faces = 1; info->ResourceType = D3DRTYPE_TEXTURE; } /* calculate the expected length */ width = info->Width; height = info->Height; + depth = info->Depth; for (i = 0; i < info->MipLevels; i++) { UINT pitch, size = 0; calculate_dds_surface_size(info, width, height, &pitch, &size); + size *= depth; expected_length += size; width = max(1, width / 2); height = max(1, height / 2); + depth = max(1, depth / 2); } expected_length *= faces; diff --git a/dlls/d3dx9_36/tests/surface.c b/dlls/d3dx9_36/tests/surface.c index 84b1c569041..5a012000855 100644 --- a/dlls/d3dx9_36/tests/surface.c +++ b/dlls/d3dx9_36/tests/surface.c @@ -544,7 +544,7 @@ static void test_D3DXGetImageInfo(void) ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); hr = D3DXGetImageInfoFromFileInMemory(dds_volume_map, sizeof(dds_volume_map) - 1, &info); - todo_wine ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); + ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA); /* cleanup */ -- 2.11.4.GIT